起初:不,这不是重复。我知道在HTML页面中搜索元素有一些可能性,但这不是我的问题。
我将概述我的问题:
我的PHP代码是因为我无法在每次页面渲染时调用2-3次。
我的代码抓取特定单词的html内容,并用链接替换它们。
要归档此处,我使用的是https://github.com/sunra/php-simple-html-dom-parser。
这是我的来源:
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++;
}
}
}
问题是:如果$tooltip
包含与标记匹配的单词,则会替换此单词。因此结果是<a href='foo.html' target='_self' data-uk-tooltip title='<a href='bar.html'...'>\$0</a>
,它会破坏页面的标记。
所以我的问题:如何防止这种情况?
答案 0 :(得分:1)
使用lookbehind:
$element->innertext = preg_replace(
'(?<!\w=['"])\b' . preg_quote( $text, "/" ) . '\b/ig',
"<a href='$url' $hrefclass target='$target' $tmpval>\$0</a>",
$element->innertext,
1
);