替换单词 - 忽略括号之间的单词

时间:2010-06-21 18:42:40

标签: php

我正在使用ubb解析器将括号内的多个代码转换为html代码。我想使用字符串替换器以及替换一些不需要的单词。

现在,我正在使用它:

foreach($f AS $value) {
            $escapeNamesArray[] = '/'.$value['woord'].'/i';
            $escapeNamesReplace[] = '<span style="color: gray;">'.$value['vervanging'].'</span>';
        }

        $string = preg_replace($escapeNamesArray, $escapeNamesReplace, $string);

当我想将“Hello”替换为“Hey”时,一切正常。但是当我在括号之间放置“Hello”这个词时,例如:

[url = http://www.hello.com]kdskdsds[/url]

“Hello”一词也被替换了。如何更改preg_replace函数的模式以忽略括号中的单词?

感谢您的回复!

4 个答案:

答案 0 :(得分:0)

我建议将每个变量分开并打开和关闭。 如果它在开放式支架上分开,那么你知道它包含一个开口支架。调用open括号左侧字符串的replace(调用var1)。然后在结束括号上调用split,你知道左边的字符串是括号的内容,所以将它连接到var 1(称为var2)。然后调用replace到最后一次拆分右边的字符串,因为它必须在结束括号之外,并将结果连接到var2。

示例:

$exampleStr  = "[url=http://www.hello.com]kdskdsds[/url]";
$piecesOfString = explode("[", $exampleStr);
// $piecesOfString[0] = "" --> before the opening bracket so if there was anything there you would have to replace
// $piecesOfString[1] = "url=http://www.hello.com]kdskdsds"
// $piecesOfString[2] = "/url]";"

$piecesOfStringSecond = explode("]", $piecesOfString[1]);
// $piecesOfStringSecond[0] = "url=http://www.hello.com" within the brackets so don't replace
// $piecesOfStringSecond[1] = "kdskdsds" //outside bracket so replace


$piecesOfStringSecond = explode("]", $piecesOfString[2]);
// $piecesOfStringSecond[0] = "/url" within the brackets so don't replace
// $piecesOfStringSecond[1] = "" //outside bracket so if length > 0 replace

我没有检查过这个,我用伪代码给你这个,但是:

$exampleStr  = "begin[url=http://www.hello.com]kdskdsds[/url]between[url=http://www.second.com]dsfafa[/url]between2[url=http://www.third.com]kjhjkhk[/url]end";
$piecesOfStringOpen = explode("[", $exampleStr);  //splits the string at the "["
for integer j = 0 to length of $piecesOfStringOpen {
   if (j == 0) { // you know it will be the first part "begin"
      // call replace on $piecesOfStringOpen[j] because you know it is outside of brackets
   } else {  
      //this will include:
      //  $piecesOfStringOpen[1] = "url=http://www.hello.com]kdskdsds"
      //  $piecesOfStringOpen[2] = "/url]between"
      //  $piecesOfStringOpen[3] = "url=http://www.second.com]dsfafa"
      //  etc
      $piecesOfStringClose = explode("]", $exampleStr);  //splits the string at the "]"
      for integer k = 0 to length of $piecesOfStringClose {
         //if k == 0 then it was inside bracket, is a url and don't replace
         //elsif k == 1 then it was outside bracket and you want to replace
      }
   }
}

答案 1 :(得分:0)

在HTMl-ish情况下使用preg_replace经常变成泥坑。我强烈建议您找到解决此问题的不同解决方案。

我建议先让解析器完成工作,将所有内容都转换为有效的XHTML。然后使用SimpleXMLElement或DOMDocument之类的东西来解析文档。然后,您可以遍历该对象,替换每个元素中的错误字符串。完成后,将其转换回XHTML字符串。

此解决方案涉及更多,但它更强大,更灵活,特别是如果您决定稍后添加更多过滤器和替换。

答案 2 :(得分:0)

卢卡斯是对的,但它只是对现有代码的一个简单改动:

你只需要在[]

之间添加确保其唯一匹配的单词

我刚刚在你的模式数组中添加[和](你需要转义它们,因为它们通常用于正则表达式字符数组)。这是更新的代码:

foreach($f AS $value)
{
$escapeNamesArray[] = '/ '.$value['woord'].' /i';
$escapeNamesReplace[] = '<span style="color: gray;">'.$value['vervanging'].'</span>';
}

$string = preg_replace($escapeNamesArray, $escapeNamesReplace, $string);

这是唯一实际更改的行:

$escapeNamesArray[] = '/ '.$value['woord'].' /i';

这适用于[whatever] [ whatever] [whatever ]但不适用[ whatever ]

我没有机会测试这个,但它应该有效。

编辑:稍微更改一下代码,请再看一下:o)

答案 3 :(得分:0)

您可以利用BBCode PECL extension为您做繁重的工作。看看这个:

<?php

function filterWords($content, $argument) {

  $badWordList = array(
    'complex',
    'regular expressions',
    'O(n^2)'
  );

  return str_ireplace($badWordList, '', $content);
}

$bbcodeParserConfig = array(
  ''    => array(
                'type' => BBCODE_TYPE_ROOT,
    'content_handling' => 'filterWords'
  ),
  'url' => array(
                'type' => BBCODE_TYPE_OPTARG,
            'open_tag' => '<a href="{PARAM}">',
           'close_tag' => '</a>',
         'default_arg' => '{CONTENT}',
              'childs' => ''
  )
);

$bbcodeParser = bbcode_create($bbcodeParserConfig);

$content = 'This is a complex url that [url=http://www.example.com]tells you nothing about regular expressions or O(n^2) algorithms[/url] and thankfully so!';

var_dump(bbcode_parse($bbcodeParser, $content));

还有BBCode parser written in PHP