0

条件:我有来自 wysiwig (Brief) 的 html 代码。我需要将 readmore 链接注入到最后一个段落(p-tag)

public function injectReadMore($html){
        if( $this->is_html($html) ){
            return preg_replace('#\<\/p\>$#isU',' <a href="javascript:void(0)" class="toggle-full-dsc">Читать полностью</a>$0', $html);
        } else {
            return '<p>'.$html.' <a href="javascript:void(0)" class="toggle-full-dsc">Читать полностью</a></p>';
        }
    }

是的。我写的不对。因为如果

$html = '<p>sdfgsdfg</p><div><p>sdfgsdfg</p> </div> ';

失败。

尝试过正则表达式:

'#\<\/p\>[^p]+?$#isU'
'#\<\/p\>[^\/p]+?$#isU'
'#\<\/p\>[^[\/p]]+?$#isU'

和 RegExp 的相同变体。我不明白一些东西,也许是全部;)

请帮忙。谢谢,兄弟们。

4

3 回答 3

2

您可以使用带有负前瞻的正则表达式模式(?!...)

</p>(?!.*</p>)

正则表达式

示例: http: //www.debuggex.com/r/rgV-ddCbL-BH_rL_/0

于 2013-07-22T19:46:25.467 回答
2

使用常规字符串替换而不是正则表达式很容易做到这一点:

$pos = strripos($html, '</p>'); // Find last paragraph end
if ($pos !== false) { // Use exact matching, to distinguish 0 from false
    // Insert anchor before it
    $html = substr_replace($html, ' <a href="javascript:void(0)" class="toggle-full-dsc">Читать полностью</a>', $pos, 0);
}
return $html;
于 2013-07-22T19:46:36.493 回答
1

负前瞻,但记得转义你的 html。

preg_replace('/\<\/p\>(?!.*\<\/p\>)/isU', '<a href="javascript:void(0)" class="toggle-full-dsc">Читать полностью</a></p>', $html);
于 2013-07-22T20:05:50.233 回答