最佳正则表达式:重复出现

时间:2016-08-12 12:37:58

标签: php regex

我尝试用空字符串替换以下标记及其内容:

<a href="http://localhost/photo/448e7d40ed468d73c5f9caba573f6273-0.png" class="wall-image-anchor" target="_blank"><img src="http://localhost/photo/448e7d40ed468d73c5f9caba573f6273-0.png" /></a>

请注意,<a>标记内的href网址可以是任何内容。 <a>内的内容也是如此,在这种情况下<img>及其内容。

到目前为止,我得到了以下代码:

$text = preg_replace('@(.*?)<(?:a\b.*?class="wall-image-anchor".*?)>.*?</a>(.*?)@si', '$1$2', $text);

此代码应转换以下字符串:

zzzzz<a href="http://localhost/zz/photo/448e7d40ed468d73c5f9caba573f6273-0.png " class="wall-image-anchor" target="_blank"><img src="http://localhost/zz/photo/448e7d40ed468d73c5f9caba573f6273-0.png" alt="Image/photo" /></a>ffff<br /><a href="http://localhost/ada/photo/448e7d40ed468d73c5f9caba573f6273-0.png " class="wall-image-anchor" target="_blank"><img src="http://localhost/ada/photo/448e7d40ed468d73c5f9caba573f6273-0.png" alt="Image/photo" /></a>ffffgg ffff<br /><a href="http://localhost/dad/photo/448e7d40ed468d73c5f9caba573f6273-0.png " class="wall-image-anchor" target="_blank"><img src="http://localhost/dad/photo/448e7d40ed468d73c5f9caba573f6273-0.png" alt="Image/photo" /></a>ffffgg'

成:

zzzzzffff
ffffgg ffff
ffffgg

此代码有效。我的问题是:还有其他方法可以让它更快吗?

问候

2 个答案:

答案 0 :(得分:1)

这里的第一个问题是正确性。如上所述,无论<a>属性是什么,您的正则表达式都会从第一个class标记的开头开始匹配。 (demo)您需要将内部.*?替换为超出标记边界的内容[>]*,即(.*?)

这也将大大减少回溯量,大大提高性能。你应该做的另一件事是摆脱任何一端的'@<a\b[^>]*class="wall-image-anchor"[^>]*>.*?</a>@si' 。任何与正则表达式不匹配的东西都不受替换操作的影响,所以你只是让它做了不必要的工作。

以下是它的外观:

action:

demo

答案 1 :(得分:0)

你知道懒惰的比赛是如何起作用的,那你怎么不这样做呢?

$var = "zzzzz<a href=\"http://localhost/zz/photo/448e7d40ed468d73c5f9caba573f6273-0.png \" class=\"wall-image-anchor\" target=\"_blank\"><img src=\"http://localhost/zz/photo/448e7d40ed468d73c5f9caba573f6273-0.png\" alt=\"Image/photo\" /></a>ffff<br /><a href=\"http://localhost/ada/photo/448e7d40ed468d73c5f9caba573f6273-0.png \" class=\"wall-image-anchor\" target=\"_blank\"><img src=\"http://localhost/ada/photo/448e7d40ed468d73c5f9caba573f6273-0.png\" alt=\"Image/photo\" /></a>ffffgg ffff<br /><a href=\"http://localhost/dad/photo/448e7d40ed468d73c5f9caba573f6273-0.png \" class=\"wall-image-anchor\" target=\"_blank\"><img src=\"http://localhost/dad/photo/448e7d40ed468d73c5f9caba573f6273-0.png\" alt=\"Image/photo\" /></a>ffffgg'";

$output = preg_replace("/<.*?>/", "", $var);

或者您只是尝试专门匹配href和img?

PS。请在下次拼出你的字符串,以便更容易看到你想要抓住的部分。