JonYork
JonYork

Reputation: 1243

Regex is not matching pattern, only the individual parts

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&#160;:</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&#160;:
    <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 «&#160;droit à la confidentialité&#160;», 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 «&#160;protection contractuelle&#160;». 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&#160;RC312, Déclaration de renseignements sur les opérations à déclarer</a>, au plus tard le&#160;30&#160;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é&#160;:</strong> Si vous, ou votre représentant, ne produisez pas le formulaire&#160;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&#160;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&#160;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&#160;2013 intitulé <a href="/nwsrm/fctshts/2013/m08/fs130830-fra.html">Nouvelles exigences en matière de déclaration&#160;: 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&#160;:</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> &#224; 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

Answers (2)

Matt
Matt

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

Les
Les

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

Related Questions