【问题标题】:regex preg_replace breaks when bbcode正则表达式 preg_replace 在 bbcode 时中断
【发布时间】:2015-08-31 15:01:27
【问题描述】:

我正在结果页面上创建搜索词的亮点。

这是我现在使用的:

$resmessage = preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "/iu", '<span  class="searchword" >' . $searchword . '</span>', $resmessage );

但是当单词是附件上的标题名称时,会破坏布局。

示例文本:

test ok /n[attachment=1]test-2.png[/attachment]

结果:

test ok test-2.png" title="test-2.png" rel="lightbox[imagelink2]">  test-2.png" style="max-height:800px;" alt="" />

所以我想在搜索词之前排除任何字符。 这样做的正则表达式是什么,我尝试了很多选项。

【问题讨论】:

  • none character 是什么意思?空格?...或者$searchword 是什么,所以我可以在本地运行测试。
  • like ] searchword = test
  • 那么,如果空格尾随搜索词替换它?示例输出应该是&lt;span class="searchword" &gt;test&lt;/span&gt;ok /n[attachment=1]test-2.png[/attachment],对吗?
  • 或者粗体是最好的方式,所以你有:[b]test[/b]ok n[attachment=1]test-2.png[/attachment],后面一定要有空格用于查找单词的搜索词

标签: php regex preg-replace bbcode


【解决方案1】:

您可以使用正则表达式回溯控制动词((*SKIP)(*FAIL) 部分)来做到这一点。

这将允许您匹配不在 BBcode 内的任何字符串(标签之间或标签名称本身):

$searchword = "test";

$resmessage  = "test attachment ok \n[attachment=1]test-2.png[/attachment] test ";
$resmessage .= "[test]test[/test] ok [attachment=1]my-test-2.png[/attachment] test";

$pattern = '/\[.+?\].*?\[\/.+?\](*SKIP)(*FAIL)|' . 
    preg_quote($searchword, '/') . 
    "/iu";

$resmessage = preg_replace(
    $pattern, 
    '<span class="searchword">' . $searchword . '</span>', 
    $resmessage
);

这将返回:

<span class="searchword">test</span> attachment ok 
[attachment=1]test-2.png[/attachment] <span class="searchword">test</span> 
[test]test[/test] ok [attachment=1]my-test-2.png[/attachment] 
<span class="searchword">test</span>

【讨论】:

  • 这会破坏 bbcode。和我的第一篇文章一样。
  • 您能否提供一个中断代码的示例?
  • 抱歉,我不是这个意思。我不是指损坏的代码,我需要原始字符串才能进行任何处理。
  • 原字符串:test ok /n[attachment=1]test-2.png[/attachment]
  • 对我来说很好用:ideone.com/fork/a0X5Nv,访问它并点击运行,你会得到:&lt;span class="searchword"&gt;test&lt;/span&gt; ok /n[attachment=1]test-2.png[/attachment]
【解决方案2】:

这应该为你做。 \s 是空格(制表符、换行符或空格),+ 表示出现一个或多个空格字符。

<?php
$resmessage = "test ok /n[attachment=1]test-2.png[/attachment]";
$searchword = 'test';
echo preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "\s+/iu", '<span  class="searchword" >' . $searchword . '</span>', $resmessage);

输出:

<span  class="searchword" >test</span>ok /n[attachment=1]test-2.png[/attachment]

你可以用你想要的任何东西替换它 preg_replace 的第二个参数就是你想要的。 http://php.net/manual/en/function.preg-replace.php

所以

echo preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "\s+/iu", '[b]' . $searchword . '[/b]', $resmessage);

会给你

[b]test[/b]ok /n[attachment=1]test-2.png[/attachment]

【讨论】:

  • 几乎可以工作。当标题只是“测试”时,不会突出显示
  • 您能否提供完整的输入示例,其中包含test?在你上面的例子中,它会变成testok test-2.png" title="test-2.png" rel="lightbox[imagelink2]"&gt; test-2.png" style="max-height:800px;" alt="" /&gt;吗?您可以将 + 更改为 * 但这相当于不检查空格,因为不再需要它。
  • ' . $searchword . '', $resmessage);
  • 不,我的意思是当您正在搜索的字符串$resmessage 的搜索词没有空格并且您想要找到它时。例如,如果您的字符串中有测试员、测试、睾酮、推荐等,您是否仍只想找到test?如果是这样,一切都会变成[b]test[/b]....词尾,这是你想要的吗?
  • 我想要的是突出显示所有搜索词,附件或 url bbcodes 除外。因为 bbcode 更改为 html,并破坏了图像结果,并显示 html 为:s24.postimg.org/xmgd4jgl1/Untitled.jpg 所以我想要一个正则表达式来搜索单词,除了 [*] 用于搜索词
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2012-04-26
  • 2018-06-02
  • 1970-01-01
  • 2011-05-20
  • 2016-07-11
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多