我正在使用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函数的模式以忽略括号中的单词?
感谢您的回复!
答案 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));