php - 查找并替换可能部分位于 html 标记内的字符串

标签 php html regex preg-replace html-parsing

有人可以针对以下问题提出可能的解决方案吗。

例如,我有一串文本“Suspendisse potenti”。

我需要在一些 html 中搜索字符串并将其包装在 span 标记中:

这样

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse potenti. In sed mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

会变成

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
<span class="search-match" id="search-term-0">Suspendisse potenti</span>. 
In sed mauris vel nibh dapibus pellentesque eu id dolor. Morbi dictum 
quam eleifend ante mattis rutrum. Mauris nisl ligula, consectetur eget 
gravida vel, varius vel metus. Nullam a ante metus.</p>

我有这个工作使用:$text = preg_replace_callback( '/(' . preg_quote($searchTerm, '/') . '*)/', "Search::addSearchId", $text );

我遇到的问题是当我正在搜索的文本中的部分字符串位于 html 标记中时。

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse <a href="/link">potenti</a>. In sed mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

或在标签中使用搜索词和额外文本

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque 
scelerisque neque in eros convallis egestas. Phasellus lacus massa, 
laoreet cursus scelerisque id, posuere ac mauris. In hac habitasse 
platea dictumst. Aenean eros dui, congue ut ultrices vitae, convallis
quis felis. Ut non ante non nunc tempus ultrices et et ipsum. 
Suspendisse <a href="/link">potenti In sed</a> mauris vel nibh dapibus 
pellentesque eu id dolor. Morbi dictum quam eleifend ante mattis rutrum. 
Mauris nisl ligula, consectetur eget gravida vel, varius vel metus. 
Nullam a ante metus.</p>

这显然错过了文本,因为它只搜索没有任何标签的纯字符串。

有没有人有任何方便的正则表达式可以匹配纯字符串以及其中包含 html 的字符串?

这是为了在从搜索页面引用后在页面顶部创建一些 anchor ,我想突出显示搜索词,所以我需要包装整个字符串。

最佳答案

试试这个

$result = preg_replace_callback('%\b(Suspendisse potenti)(?!</\w+)\b%im', 'compute_replacement', $subject);

function compute_replacement($groups) {
    // You can vary the replacement text for each match on-the-fly
    // $groups[0] holds the regex match
    // $groups[n] holds the match for capturing group n
    return '<span>$1</span>';
}

关于php - 查找并替换可能部分位于 html 标记内的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011236/

相关文章:

PHP HTTP 下载 header

php - 如何使用 SQL 闭包表模式获取所有同级(无需子查询!)

javascript - jQuery .click() 不执行任何操作

java - 仅捕获正则表达式字符串的第一次出现

接受 7 位 ascii 字符的 Java 代码

mysql - 从字符串中删除某些字符组

php - 在客户端重用 Yii Framework CValidator 规则

php - 使用 'standalone parentheses'

javascript - 动态调整包含 Handsontable 的容器的大小

javascript - 如何获取本地存储值