我有一个代码可以替换加载的html上的所有事件,如何修改它以仅替换从加载的html结尾开始的第一个事件?
$body = preg_replace('#<div>https://site.com/(.*?)<br />#', '<a href="site.com/$1" target="_blank">https://site.com/$1</a><br />', $body);
我加载的html :(已压缩,没有任何断行)
<div class="clearfix spoiler"><div>https://site.com/?k=tZ1gXCyS!fywvS1E9rmnUJyjEWOkH0zHZ<br />https://site.com/#!BJchGYSB!Av27mwaKMv7zVNu9uL0fg3uUDfBoym2Lk9NeyZJp_1I<br />https://site.com/#!MdM3lDga!HHlk9SvherA-LYNAfDd9SBEwKUp3dn9oELCPVHf2mYc<br />https://site.com/#!EQ8CwZoA!QJVJMgn2cj-cmIX51Hn2OH8ySPYWw5Xy-e9tX53emDY<br />https://site.com/#!sRESXSSa!ZFuNpzMzTpF9DRohX4WNTDyo4pAkwuX0Gkh-vToQ5ec<br />https://site.com/#!NUtVmQbb!eT0qf05YySrq-hXHhj53lmTi1bcWsprB50NsZqh5MLg<br />https://site.com/#!IcdymLia!eoeI0xz-BAoVRnbL_1W2DQMUmBYtXQaaVS7-G69fY5w<br />https://site.com/#!QFVnFAKD!RhXtx3pPFrrpxw3kKmkw2ScEBgR1pD_byIvpWHHQ6ok<br />https://site.com/#!1VtDRI5J!ZUNHtxKTnnrF29z0AKLULSbsgLZ0-F_45TpmEhwijz8</div></div>
我需要替换上一个<br />https://site.com/(.*?)</div>
(链接始终更改)whit <div>https://site.com/$1</div>
(仅从最后一个匹配或从头开始的第一个匹配)
所以输出应该是这样的:
<div class="clearfix spoiler"><div>https://site.com/?k=tZ1gXCyS!fywvS1E9rmnUJyjEWOkH0zHZ<br />https://site.com/#!BJchGYSB!Av27mwaKMv7zVNu9uL0fg3uUDfBoym2Lk9NeyZJp_1I<br />https://site.com/#!MdM3lDga!HHlk9SvherA-LYNAfDd9SBEwKUp3dn9oELCPVHf2mYc<br />https://site.com/#!EQ8CwZoA!QJVJMgn2cj-cmIX51Hn2OH8ySPYWw5Xy-e9tX53emDY<br />https://site.com/#!sRESXSSa!ZFuNpzMzTpF9DRohX4WNTDyo4pAkwuX0Gkh-vToQ5ec<br />https://site.com/#!NUtVmQbb!eT0qf05YySrq-hXHhj53lmTi1bcWsprB50NsZqh5MLg<br />https://site.com/#!IcdymLia!eoeI0xz-BAoVRnbL_1W2DQMUmBYtXQaaVS7-G69fY5w<br />https://site.com/#!QFVnFAKD!RhXtx3pPFrrpxw3kKmkw2ScEBgR1pD_byIvpWHHQ6ok<div>https://site.com/#!1VtDRI5J!ZUNHtxKTnnrF29z0AKLULSbsgLZ0-F_45TpmEhwijz8</div></div>
答案 0 :(得分:1)
您可以修改搜索,以确保其中的其余字符串不包含<br />
。为此,您可以输入类似:#<br />https://site.com/((?:(?!<br />).)*?)</div>#
作为搜索字符串的内容。 ?!
是negative lookahead assertion,它会检查以确保字符串不在前面,然后.
捕获,就像您通常所期望的那样。
答案 1 :(得分:0)
最简单的方法是在开头和结尾添加(.*)
组,在结尾添加$
,并使用s
修饰符,以便.
匹配换行符。第一组将包含直到最后一个实例的所有内容(因为.*
是贪婪的),最后一组将在之后捕获所有内容。
$body = preg_replace(
'#(.*)<div>https://site.com/(.*?)<br />(.*)$#s',
'$1<a href="site.com/$2" target="_blank">https://site.com/$2</a><br />$3',
$body
);