如何只更换一次而不在标签中?

时间:2011-12-30 08:49:06

标签: php

我需要在网站上替换我的文字中的姓名。但是文本中的名称只需要替换,而不是标记。

例如:

<img src="" title="Justin Bieber" /> bla bla bla bla Justin Bieber bla bla bla Justin Bieber bla bla bla bla

对此:

<img src="" title="Justin Bieber" /> bla bla bla bla <a href="http://en.wikipedia.org/wiki/Justin_Bieber">Justin Bieber</a> bla bla bla Justin Bieber bla bla bla bla

我找到了答案:

$text = '<img src="" title="Justin Bieber" /> bla bla bla bla Justin Bieber bla bla bla Justin Bieber bla bla bla bla';

$text = preg_replace('/Justin Bieber(?![^<>]*+>)/i', '<a href="http://en.wikipedia.org/wiki/Justin_Bieber">Justin Bieber</a>', $text, 1);

图像标记中只有一个而且没有。

2 个答案:

答案 0 :(得分:1)

如果要解析任何复杂性的HTML,请使用HTML解析器。在此网站上搜索“HTML Parser”,您将获得许多很多结果。

如果您正在处理小的受控字符串,请使用正则表达式。

以下是非常简单示例:http://regexr.com?2vjqc

它只是检查“Justin Bieber”是否在引号内(因为它应该在HTML标记内)。有十几种方法可能会失败(空格,缺少引号,文档中其他地方的引号,格式错误的标签等)

当然,这个正则表达式可以改进但是如果你无法控制源代码,我强烈建议使用HTML解析器而不是正则表达式。

答案 1 :(得分:-2)

$text = '<img src="" title="Justin Bieber" /> bla bla bla bla Justin Bieber bla bla bla Justin Bieber bla bla bla bla';
$replacement = '<a href="http://en.wikipedia.org/wiki/Justin_Bieber">Justin Bieber</a>';
echo preg_replace('/\s+Justin Bieber/i', $replacement, $text, 1);