Php 防止替换元素时出现递归
首先:不,这不是复制品。我知道可以在HTML页面中搜索元素,但这并不是我真正的问题 我将概述我的问题: 我的PHP代码是因为我不能在每个页面渲染时调用2-3次更改 我的代码对特定单词的html内容进行爬网,并用链接替换它们 为了存档我正在使用的文件 这是我的消息来源: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']
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处不是固定长度。对不起,更新了我的答案。