使用正则表达式附加html标记

时间:2014-10-07 12:08:03

标签: php regex

我想更改一个字符串:

<a href....>*</a>

为:

<article><a href=....>*</a></article>

我试过这个,但我对RegEx的理解太糟糕了。

$n = '/<a (.*)[^>]>/';
$h = '/<article><a(.*)[^>]>/i','/<\/a></articla>/';
$reg = preg_replace($n, $h, $content);

2 个答案:

答案 0 :(得分:1)

您的解决方案将匹配&lt; a href ...&gt;但不是结束元素。

试试这个:

$n = '/(<a [^>]*>([^<]*<(\/[^a])|[^\/])*\/a>)/i';
$h = '<article>${1}</article>';
$reg = preg_replace($n, $h, $content);

修改

现在尊重子元素

Explenation:

<a [^>]*>

匹配开始标记。

(
[^<]*<

找到下一个标签。

(\/[^a])|[^\/]
)*

确保下一个标记不是结束&lt; / a&gt;所以匹配所有其他标签。

\/a>

最后匹配结束&lt; / a&gt;。 (注意:&lt;已经匹配)。

答案 1 :(得分:0)

如果$content只是一个“字符串”而不是html,那么只需采用简单的方法:

$content = str_replace('</a>','</a></article>',str_replace('<a href=','<article><a href=',$content));

简单,干净,无需正则表达式。

如果$content不只是一个“字符串”,但它是html,那么也不是str_replace,也不是正则表达式。你需要一个html解析器。