Reputation: 1243
I am trying to search for this expression:
<main([\w\W]*)list-unstyled([\w\W]*)</main>
This expression works perfectly in Sublime Text, Notepad++ Etc, and does exactly what I want. Look between for list-unstyled.
My script below works with: list-unstyled, <main, </main>, <main([\w\W]*), ([\w\W]*)</main>
but not <main([\w\W]*)</main>
, let alone what I really want, <main([\w\W]*)list-unstyled([\w\W]*)</main>
, or better yet
<main([\w\W]*)$pattern([\w\W]*)</main>
How can I get it to work with that expression?
This is my code so far:
param(
[string]$pattern,
[string]$path
)
Get-ChildItem -path $path -Recurse -Filter *.html |
Select-String $pattern |
Group-Object Path |
ForEach-Object{
$props = @{
File = $_.Group | Select-Object -First 1 -ExpandProperty Path
PatternFound = ($_.Group | Select-Object -ExpandProperty LineNumber) -join ";"
}
New-Object -TypeName PSCustomObject -Property $props
}
Sample code from a page
<main class="col-md-9 col-md-push-3" property="mainContentOfPage" role="main">
<h1 property="name" id="wb-cont">Divulgation d’opérations à déclarer </h1>
<div class="wb-share text-right mrgn-tp-lg mrgn-bttm-lg"></div><h2>Le saviez-vous?</h2>
<p>Les opérations à déclarer doivent être divulguées à l’Agence du revenu du Canada (ARC).</p>
<h2>Qu’est-ce qu’une opération à déclarer?</h2>
<p>Il s’agit d’un type particulier d’évitement fiscal qui consiste en une opération menée seule, ou dans le cadre d’une série d’opérations, et visant à éviter de payer de l’impôt. Elle doit répondre à au moins deux des trois critères suivants :</p>
<ol>
<li>Le promoteur ou le conseiller fiscal de l’opération a le droit de recevoir des honoraires qui sont fondés sur ce qui suit :
<ol class="lst-lwr-alph">
<li>le montant de l’avantage fiscal;</li>
<li>l’obtention de l’avantage fiscal;</li>
<li>le nombre de personnes qui prennent part à l’opération ou qui ont pu profiter des conseils du promoteur ou du conseiller fiscal au sujet des conséquences fiscales de l’opération.</li>
</ol>
</li>
<li>Le promoteur ou le conseiller fiscal de l’opération obtient le « droit à la confidentialité », qui vous empêche de divulguer des renseignements sur les détails ou la structure de l’opération.</li>
<li>Vous, la personne qui conclut l’opération en votre nom, le promoteur ou le conseiller fiscal se prévaut ou s’est prévalu d’une « protection contractuelle ». Il s’agit de toute forme de protection contre l’échec de l’opération ou qui donne droit au paiement de dépenses (y compris d’impôt, de pénalités, d’intérêts ou d’un montant semblable) qui peuvent être engagées en cas de différend à l’égard de l’avantage fiscal.</li>
</ol>
<h2>Qui doit divulguer des opérations à déclarer?</h2>
<p>Si vous concluez une opération à déclarer pour vous‑mêmes ou au profit d’une autre personne, vous devez la divulguer. Les promoteurs et les conseillers fiscaux sont aussi tenus de le faire.</p>
<h2>Quel est le processus pour divulguer une opération à déclarer?</h2>
<p>Que vous soyez un particulier, une société, une fiducie ou une société de personnes, vous devez remplir une déclaration de renseignements et l’envoyer à l’Agence du revenu du Canada. Vous devez produire le <a href="/F/pbg/tf/rc312/">formulaire RC312, Déclaration de renseignements sur les opérations à déclarer</a>, au plus tard le 30 juin suivant l’année civile au cours de laquelle l’opération est devenue pour la première fois une opération à déclarer. Ce formulaire doit être produit séparément de votre déclaration de revenus et de toute autre déclaration de renseignements.</p>
<h2>Quelles sont les conséquences si on ne déclare pas une opération?</h2>
<ul class="list-unstyled">
<li><strong>Pénalité :</strong> Si vous, ou votre représentant, ne produisez pas le formulaire RC312 dans le délai prévu, vous devrez, ainsi que chaque personne tenue de le produire, payer une pénalité, même s’il a eu entente sur qui devait le produire. Le montant de la pénalité est égal au montant total des honoraires à l’égard de l’opération que le promoteur ou le conseiller fiscal a le droit de recevoir.</li>
<li><strong>Suspension de l’avantage fiscal :</strong> En plus de la pénalité, l’avantage fiscal est refusé jusqu’à ce que l’obligation de produire le formulaire RC312 soit satisfaite et que la pénalité et les intérêts cumulés soient payés.</li>
<li><strong>Période de nouvelle cotisation prolongée :</strong> Si le formulaire RC312 n’a pas été produit dans le délai prévu, la période pendant laquelle l’ARC peut établir une nouvelle cotisation est prolongée de trois ans suivant la date où il a été produit.</li>
</ul>
<p>Pour en savoir plus, consultez le document d’information de 2013 intitulé <a href="/nwsrm/fctshts/2013/m08/fs130830-fra.html">Nouvelles exigences en matière de déclaration : opérations à déclarer</a> ou le <a href="/F/pbg/tf/rc312/">formulaire RC312, Déclaration de renseignements sur les opérations à déclarer</a>.</p>
<p class="text-center">-30-</p>
<h2>Soyez branché</h2>
<p>Pour recevoir des mises à jour lorsque nous ajoutons de nouveaux renseignements à notre site Web, vous pouvez :</p>
<ul class="list-unstyled mrgn-lft-md">
<li><img alt="" src="/images/scl-md/16px/twitter.gif" height="16" /> Suivre l'ARC sur Twitter - <a href="http://twitter.com/agencerevcan">@AgenceRevCan</a></li>
<li><img alt="" src="/images/scl-md/16px/email.gif" height="16" /> Vous abonner à une <a href="/esrvc-srvce/mllst/sbscrb-fra.html">liste d'envois électroniques</a> de l'ARC</li>
<li><img alt="" src="/images/scl-md/16px/rss.gif" height="16" /> Ajouter nos <a href="/esrvc-srvce/rss/menu-fra.html">fils RSS</a> à votre lecteur de nouvelles</li>
</ul>
<p><img alt="" src="/images/scl-md/16px/youtube.gif" height="16" /> Vous pouvez également visiter notre <a href="http://www.youtube.com/agencerevcan">canal YouTube</a> pour voir des vidéos sur l'impôt.</p>
<p><a href="/nwsrm/md-fra.html">Renseignements aux médias</a></p>
<p><br />
<!-- InstanceEndEditable --></p>
<dl property="dateModified" id="wb-dtmd">
<dt>Date de modification :</dt>
<dd>
<time>2015-06-11</time>
</dd>
</dl>
</main>
Thanks!
Upvotes: 0
Views: 192
Reputation: 46710
Just like everyone is suggesting here in comments and in your last question you should use html parsers if possible. I don't have the best experience with them so I will try to update this code to comply with your needs.
The main problem you are having is that when you pass a file object to Select-String
it will be read in a string array and not a single string. Both approaches have their merits but in your case this is not what you want since you need to do a multi-line match. Since line number is not important this can be simplified
param(
[string]$pattern,
[string]$path
)
Get-ChildItem -path $path -Recurse -Filter *.html |
Where-Object{
Select-String -InputObject (Get-Content $_.FullName | Out-String) $pattern -Quiet
}
}
What that will do is use Get-Content
to read in the entire file as one string with the help of | Out-String
then we use a slightly tweaked version of your regex. We needed to escape a backslash and add a couple of modifiers. </main>
became <\/main>
in the pattern below as well as adding (?sm)
.
(?sm)<main([\w\W]*)list-unstyled([\w\W]*)<\/main>
Since we use -Quiet
with Select-String
we only get a boolean result. Using that inside the Where-Object
clause allow only the fileinfo object matching the criteria to pass thru the pipe. That way if you had to say.. move the files you can just tack on a Move-Item
without the need of another foreach-object
loop.
You have this as a script I will presume? If you want to filter this output you would need to add a pipe | Select Fullname | Export-CSV "C:\somepath"
. Whether you put this into the function or use it like this script.ps1 pattern path | Select Fullname | Export-CSV "C:\somepath"
is up to you.
Upvotes: 3
Reputation: 10605
Here is a PS script that might get you closer to what you are looking for. Adjust the logic for your situation.
$regex = [regex] '(?m)<main([\w\W]*)list-unstyled([\w\W]*)</main>'
get-childitem *.htm |
foreach { $txt = type $_ ;
$props = @{
status = $regex.Match($txt).Success;
path = $_
} ;
new-object -TypeName PSCustomObject -Property $props
}
status path
------ ----
True C:\Users\Les\testfile.htm
False C:\Users\Les\testfile2.htm
False C:\Users\Les\testfile3.htm
Upvotes: 1