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 = "<div>$text</div>"
或其他东西效果最好。
【讨论】:
【参考方案3】:更好的方法是使用 XML 函数。
【讨论】:
以上是关于preg_replace 仅在文本上而不是在 href 中的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch地理距离过滤器,但距离在文档上而不是在查询中
Kendo UI Grid:可以允许在指定列上而不是在其他列上进行分组
在 main 上而不是在 pyqt5 的脚本上实现按钮的功能