正则表达式匹配断线

时间:2018-02-25 01:49:38

标签: php regex

我正在寻找一个正则表达式来删除htmlA。 边界从

开始

< {if $ data.nowPage> 1}> / div> 1 breakLine < {/ if}>

HTMLA

<{if $data.nowPage>1}>
<div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a></div>
<div class="pageArrow pagePrev"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$data.nowPage-1}>"><span class="icon arrow-left"></span></a></div>
<{/if}>

我试过了

$fullHtml = readFileData($file);
preg_match("/(<{if \\\$data\.nowPage>1}>(.*?)<\/div>)(\s)(.+?)<{\/if}>/si",$fullHtml,$htmlA);
//$fullHtml = preg_replace(...,'',$fullHtml);

但它太早停止了,为什么print_r($ htmlA)会显示5个键?

Array
(
    [0] => <{if $data.nowPage>1}>
        <div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a></div>
        <div class="pageArrow pagePrev"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}>
    [1] => <{if $data.nowPage>1}>
        <div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a></div>
    [2] => 
        <div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a>
    [3] => 
    [4] => 
        <div class="pageArrow pagePrev"><a href="?<{if !empty($data.years)}>y=<{$data.years}>
)

fullHtml。第3行到第6行。

<div class="pageContainer">
    <div class="pageBox">
        <{if $data.nowPage>1}>
        <div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a></div>
        <div class="pageArrow pagePrev"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$data.nowPage-1}>"><span class="icon arrow-left"></span></a></div>
        <{/if}>

        <{for $i=$data.nowPage-$data.pageFit to $data.totalPage}>

            <{if $data.nowPage == ($i)}>
                <div class="pageBtn active"><a href="javascript:void(0);"><{$i}></a></div>
            <{else if $i>($data.nowPage+$data.pageFit)}>
                <div class="pageMore"><span class="icon moreIcon"></span></div>
                <{break}>
            <{else if $i>0}>
                <{if $i==$data.nowPage-$data.pageFit && $i>1}>
                <div class="pageMore"><span class="icon moreIcon"></span></div>
            <{/if}>
                <div class="pageBtn"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$i}>"><{$i}></a></div>
            <{else}>
            <{/if}>

        <{/for}>

        <{if $data.nowPage<$data.totalPage}>
        <div class="pageArrow pageNext"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$data.nowPage+1}>"><span class="icon arrow-right"></span></a></div>
        <div class="pageArrow pageLast"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$data.totalPage}>"><span class="icon arrow-last"></span></a></div>
        <{/if}>
    </div>
</div>

谢谢。

3 个答案:

答案 0 :(得分:1)

根据您的样本输入,我已经为您的任务编写了一个模式。

模式:~<{if \$data\.nowPage>1}>(?:\s+<div.*?</div>)+\s+<{/if}>~

Pattern Demo including leading and trailing whitespace adjustment

代码:(Demo

echo preg_replace('~<{if \$data\.nowPage>1}>(?:\s+<div.*?</div>)+\s+<{/if}>~','',$html);
  • 匹配前导if
  • 匹配一条或多条<div>
  • 匹配结束if

答案 1 :(得分:1)

这是您的RegEx,但是您忘了添加一个模式,因此一旦找到匹配就会停止:

(<{if \\\$data\.nowPage>1}>(.*?)<\/div>)(\s)(.+?)<\/div>\s*<{\/if}>
                                                 ^^^^^^^^^^
  • \s表示任何类型的空白
  

为什么print_r($htmlA)显示5个键?

preg_match函数返回数组中的第一个值作为整个匹配,其他索引保存捕获组捕获的值。你的正则表达式中有4个捕获组,因此它在返回数组中增加了4个值,这意味着共有5个键。

更好的方法

正则表达式:

~<{if \$data\.nowPage>1}>.*?</div>\s*<{/if}>~si

Live demo

PHP代码:

preg_match('~<{if \$data\.nowPage>1}>.*?</div>\s*<{/if}>~si', $str, $htmlA);

答案 2 :(得分:0)

请你试试看。

const string = `<{if $data.nowPage>1}>
<div class="pageArrow pageFirst"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=1"><span class="icon arrow-first"></span></a></div>
<div class="pageArrow pagePrev"><a href="?<{if !empty($data.years)}>y=<{$data.years}><{/if}><{if !empty($data.month)}>&m=<{$data.month}><{/if}>&p=<{$data.nowPage-1}>"><span class="icon arrow-left"></span></a></div>
<{/if}>`;

console.log(string.match(/^<{if \$data.nowPage>1}>\n<div.*\n*<div.*\n*<\/div>\n<{\/if}>/));