Reputation: 340
I'm looking for a regular expression to delete htmlA. The border start from
<{if $data.nowPage>1}> to /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}>
I have tried
$fullHtml = readFileData($file);
preg_match("/(<{if \\\$data\.nowPage>1}>(.*?)<\/div>)(\s)(.+?)<{\/if}>/si",$fullHtml,$htmlA);
//$fullHtml = preg_replace(...,'',$fullHtml);
but it stopped too early and why print_r($htmlA) shows 5 keys?
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. line3 to line6.
<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>
Thank you.
Upvotes: 1
Views: 131
Reputation: 48711
This is your RegEx but you forgot to add a pattern to it and for this reason it stops as soon as a match is found:
(<{if \\\$data\.nowPage>1}>(.*?)<\/div>)(\s)(.+?)<\/div>\s*<{\/if}>
^^^^^^^^^^
\s
means any kind of whitespacewhy
print_r($htmlA)
shows 5 keys?
preg_match
function returns first value in array as whole match and other indexes hold a value captured by a capturing group. You have 4 capturing groups in your regex so it adds 4 more values in returning array which means total 5 keys.
Regex:
~<{if \$data\.nowPage>1}>.*?</div>\s*<{/if}>~si
PHP Code:
preg_match('~<{if \$data\.nowPage>1}>.*?</div>\s*<{/if}>~si', $str, $htmlA);
Upvotes: 1
Reputation: 47874
I have written a pattern for your task, given your sample input.
Pattern: ~<{if \$data\.nowPage>1}>(?:\s+<div.*?</div>)+\s+<{/if}>~
Pattern Demo including leading and trailing whitespace adjustment
Code: (Demo)
echo preg_replace('~<{if \$data\.nowPage>1}>(?:\s+<div.*?</div>)+\s+<{/if}>~','',$html);
if
line<div>
linesif
lineUpvotes: 1
Reputation: 1319
Could you please try this out.
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}>/));
Upvotes: 0