php正则表达式与html标记外部匹配

php正则表达式与html标记外部匹配,php,regex,preg-replace,pcre,Php,Regex,Preg Replace,Pcre,我在html页面上做一个preg_替换。我的模式旨在向html中的一些单词添加周围的标记。但是,有时我的正则表达式会修改html标记。例如,当我尝试替换此文本时: <a href="example.com" alt="yasar home page">yasar</a> 如何生成正则表达式,使其与html标记内的任何内容都不匹配?这可能是您所追求的: 一般来说,我建议不要这样做。更好的替代方法是去掉所有HTML标记,转而依赖BBcode,例如: [b]bold text

我在html页面上做一个preg_替换。我的模式旨在向html中的一些单词添加周围的标记。但是,有时我的正则表达式会修改html标记。例如,当我尝试替换此文本时:

<a href="example.com" alt="yasar home page">yasar</a>

如何生成正则表达式,使其与html标记内的任何内容都不匹配?

这可能是您所追求的: 一般来说,我建议不要这样做。更好的替代方法是去掉所有HTML标记,转而依赖BBcode,例如:

[b]bold text[b] [i]italic text[i]
然而,我明白这可能不适合你正在尝试的工作


另一个选项可能是HTML净化器,请参见:

您可以使用断言,因为您只需确保搜索的单词出现在
之后或任何
]*(在我看来,这应该是有效的:

echo preg_replace("/<(.*)>(.*)<\/(.*)>/i","<$1><span class=\"some-class\">$2</span></$3>",$target);
echo preg_替换(“/(.*)/i“,“$2”,$target);

但是,我不知道这会有多安全。我只是提出一种可能性:)

亚萨尔,重新提出这个问题,因为它有另一个没有提到的解决方案

此解决方案不只是检查下一个标记字符是否为开始标记,而是跳过所有

关于使用正则表达式解析html的所有免责声明如下:

<[^>]*>(*SKIP)(*F)|word1|word2|word3
]*>(*跳过)(*F)|单词1 |单词2 |单词3
这是一本书。在代码中,它如下所示:

preg_replace("/(asf|gfd|oyws)/", '<span class=something>${1}</span>',$target);
$target = "word1 <a skip this word2 >word2 again</a> word3";
$regex = "~<[^>]*>(*SKIP)(*F)|word1|word2|word3~";
$repl= '<span class="">\0</span>';
$new=preg_replace($regex,$repl,$target);
echo htmlentities($new);
此代码的
$target=“word1

参考


  • @MarcB就这一次,我认为这是一个有效的正则表达式问题。使用DOM解析器很难轻松满足OP的要求。他只需要知道如何不匹配引号内的单词。@Xeon:还是个坏主意。使用DOM/xpath获取textnodes,然后单独操作它们。这是唯一一种100%可靠的方法,可以确保只处理ith“相关“文本,而不是一些不可靠的、格式错误的、匹配的标签。Yada Yada,愚蠢的bobince回答…”是的,那不太正确。这个正则表达式只适用于XML/XHTML,并且不适用于CDATA边缘情况等。但即使在真实的HTML中,您也不会在属性中看到尖括号。所以,基本解决方案是可行的。我发现编译失败了:当试图运行regexp时,lookback断言在偏移量27处不是固定长度。也许你错过了什么?再试一次。代码编辑自。(有一个
    ?我不知道这是怎么回事,因为我对lookaheads的概念还不熟悉,但它确实起了作用。谢谢:)@likeforex.com:我们这里不提供个人支持,所以不是论坛;不允许在两者之间讨论不同的主题。特别是如果询问是那么模糊的话。(“你试过什么?”)。我不知道你想要什么有关帮助,请参见和,以获取一些有用的工具,或获取更好的教程。
    
    $target = "word1 <a skip this word2 >word2 again</a> word3";
    $regex = "~<[^>]*>(*SKIP)(*F)|word1|word2|word3~";
    $repl= '<span class="">\0</span>';
    $new=preg_replace($regex,$repl,$target);
    echo htmlentities($new);