preg_replace 仅在文本上而不是在 href 中

Posted

技术标签:

【中文标题】preg_replace 仅在文本上而不是在 href 中【英文标题】:preg_replace on text only and not inside href's 【发布时间】:2011-04-28 17:21:52 【问题描述】:

我有这段代码可以对 html 内容进行一些丑陋的内联文本样式颜色格式化。 但这会破坏标签内的任何内容,如链接和电子邮件。

我已经弄清楚如何防止它格式化链接,但是当文本是 info@mytext.com 时它仍然不能防止替换

$text = preg_replace('/(?<!\.)mytext(?!\/)/', '<span style="color:#DD1E32">my</span><span style="color:#002d6a">text</span>', $text);

仅替换文本并防止链接替换的更好方法是什么?

【问题讨论】:

使用 HTML 解析器(例如DOMDocument)。您不能使用正则表达式来可靠地更改 HTML。在 SO 上搜索数百个相同问题中的任何一个。 【参考方案1】:

[已编辑] 哦,我看到你解决了 href 问题。 要解决您的电子邮件问题,请更改所有 @mytext。在处理文本之前,使用 str_replace 到 [email_safeguard],完成后,将其改回。 :)

$text = str_replace('info@mytext.com','[email_safeguard]',$text); 
//work on the text with preg_match()
$text = str_replace('[email_safeguard]','info@mytext.com',$text); 

这应该可以解决问题:)

但正如人们之前提到的,你最好避免使用 html 和正则表达式,否则你会遭受克苏鲁的愤怒。

see this instead

【讨论】:

【参考方案2】:

您的后向断言仅测试一个字符,因此在 html 标记之外断言匹配是不够的。这是正则表达式不是最佳选择的地方。但是,您可以得到一个近似值:

preg_replace("/(>[^<]*)(?<![@.])(mytext)/", "$1<span>$2</span>",

如果 mytext 之前没有 html 标记,这将忽略第一次出现。所以如果$text = "&lt;div&gt;$text&lt;/div&gt;" 或其他东西效果最好。

【讨论】:

【参考方案3】:

更好的方法是使用 XML 函数。

【讨论】:

以上是关于preg_replace 仅在文本上而不是在 href 中的主要内容,如果未能解决你的问题,请参考以下文章

将图标浮动在文本框上而不使用绝对位置 [重复]

elasticsearch地理距离过滤器,但距离在文档上而不是在查询中

Kendo UI Grid:可以允许在指定列上而不是在其他列上进行分组

在 main 上而不是在 pyqt5 的脚本上实现按钮的功能

IOS5 中的本地通知 - 如何让它在屏幕上而不是在通知中心弹出?

添加自定义图层时训练非常慢。我发现这个张量运算在 cpu 上而不是在 gpu 上运行,我不知道为啥?