Php 防止替换元素时出现递归

Php 防止替换元素时出现递归,php,regex,preg-replace,Php,Regex,Preg Replace,首先:不,这不是复制品。我知道可以在HTML页面中搜索元素,但这并不是我真正的问题 我将概述我的问题: 我的PHP代码是因为我不能在每个页面渲染时调用2-3次更改 我的代码对特定单词的html内容进行爬网,并用链接替换它们 为了存档我正在使用的文件 这是我的消息来源: foreach ( $dom->find( 'text' ) as $element ) { //$config['exclusions'] is an array like ['a', 'img']

首先:不,这不是复制品。我知道可以在HTML页面中搜索元素,但这并不是我真正的问题

我将概述我的问题:

我的PHP代码是因为我不能在每个页面渲染时调用2-3次更改

我的代码对特定单词的html内容进行爬网,并用链接替换它们

为了存档我正在使用的文件

这是我的消息来源:

foreach ( $dom->find( 'text' ) as $element ) {
//$config['exclusions'] is an array like ['a', 'img']
                if ( !in_array( $element->parent()->tag, $config[ 'exclusions' ] ) ) {
                    foreach ( $markers as $marker ) {
                        $text    = $marker[ 'text' ];
                        $url     = $marker[ 'url' ];
                        $tip     = strip_tags( $marker[ 'excerpt' ] );
                        $tooltip = ( $tooltip ? "data-uk-tooltip title='$tip'" : "" );
                        $tmpval  = "tmpval-$i";

                        $element->innertext = preg_replace(
                            '/\b' . preg_quote( $text, "/" ) . '\b/i',
                            "<a href='$url' $hrefclass target='$target' $tmpval>\$0</a>",
                            $element->innertext,
                            1
                        );


                        $element->innertext = str_replace( $tmpval, $tooltip, $element->innertext );
                        $i++;
                    }
                }
            }
foreach($dom->find('text')as$element){
//$config['exclusions']是类似于['a','img'的数组
如果(!在数组中($element->parent()->tag,$config['exclusions'])){
foreach($markers作为$marker){
$text=$marker['text'];
$url=$marker['url'];
$tip=strip_标签($marker['extract']);
$tooltip=($tooltip?$DataUK工具提示标题='$tip':);
$tmpval=“tmpval-$i”;
$element->innertext=preg\u replace(
“/\b”.preg_quote($text,“/”)。\b/i“,
"",
$element->innertext,
1.
);
$element->innertext=str_replace($tmpval,$tooltip,$element->innertext);
$i++;
}
}
}
问题是:如果
$tooltip
包含与标记匹配的单词,则该单词将被替换。因此结果是
,这会破坏页面的标记

所以我的问题是:如何防止这种情况发生?

使用lookback:

$element->innertext = preg_replace(
    '(?<!\w=['"])\b' . preg_quote( $text, "/" ) . '\b/ig',
    "<a href='$url' $hrefclass target='$target' $tmpval>\$0</a>",
    $element->innertext,
    1
);
$element->innertext=preg\u replace(
“(?内部文本,
1.
);

按长度降序对
$markers
进行排序,然后构建一个类似
内爆(“|“,$markers)
(请记住使用
arrapy\u map
对项目进行转义)然后运行
preg\u replace\u回调
$markers
传递到匿名函数中,在该函数中,您将能够替换当前不重叠的文本。您好,谢谢。这里我得到的>lookback断言在偏移量13处不是固定长度。对不起,更新了我的答案。