防止替换元素的递归

时间:2017-06-09 09:01:22

标签: php regex preg-replace

起初:不,这不是重复。我知道在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>,它会破坏页面的标记。

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

1 个答案:

答案 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
);