php和正则表达式

时间:2011-04-04 18:20:50

标签: php regex

好的,我现在已经尝试了好几次了。我仍然无法弄明白。

这是我的问题。我想接受任何     <br><br>并将其转为<br>

所以这就是我所做的事 $test = ereg_match("/<br><br>/", "<br>", "<br><br>Test<br><br>"); echo $test;

它产生ereg_match("/<br><br>/", "<br>", "<br><br>Test<br><br>");而不是$test == "Test"

有任何帮助吗?然后我想扩展它,以便任何$test = "<br>Test<br>"所以任何两个空间分隔的可以变成1.任何帮助?

8 个答案:

答案 0 :(得分:2)

您可以使用str_replace

<?php

$str = "<br><br>Test<br><br>";

echo str_replace("<br><br>", "<br>", $str);

<强>更新

示例:

http://codepad.org/MWzg81Qy

要替换2个或更多个br(无限间距)...你可以做preg_replace:

<?php

$str = "<br><br     >    <br><br>Test<br     ><br>";

echo preg_replace("/(\s*<br\s*>)+/", "<br>", $str);

http://codepad.org/CrltyhSs

答案 1 :(得分:0)

也许不是你所追求的答案,但使用str_replace将比正则表达式更有效。

即:$test = str_replace('<br><br>', '<br>', $sourceString);

顺便说一下,我也很想在这个时代用<br>替换<br />标签。 : - )

答案 2 :(得分:0)

你的函数名中肯定有一个拼写错误。 p reg_ *函数主要取代旧的 e reg_函数。

你的第二个正则表达式应写成:

print preg_replace("#<br\s*/?>\s*<br\s*/?>#", "<br>", "<br><br>Test");

?{0,1}的简写,并且使用#作为分隔符,可以省去正斜线的无关转义。

答案 3 :(得分:0)

你可以试试这个:

preg_replace("#<br[^>]*><br[^>]*>#", "<br>", "<br><br>Test<br><br>");

Both these lines produce same output:
var_dump(preg_replace("#<br[^>]*><br[^>]*>#", "<br>", "<br><br>Test<br><br>"));
var_dump(preg_replace("#<br[^>]*><br[^>]*>#", "<br>", "<br /><br>Test<br><br>"));

OUTOUT: string(12) "<br>Test<br>"

答案 4 :(得分:0)

完全由可选空格分隔的2 BR:

$str = preg_replace('/<br[^>]*>(?:\s*<br[^>]*>){1}/', '<br>', $str);

由可选空格分隔的2个或更多BR:

$str = preg_replace('/<br[^>]*>(?:\s*<br[^>]*>){1,}/', '<br>', $str);

答案 5 :(得分:0)

正如Mike Lewis所说,如果您不需要考虑输入字符串的变化,请使用字符串操作。另一方面,如果您想将多个<br><br/>标记折叠到一个标记中,允许在其中包含空格,这应该适合您:

$result = preg_replace('#(<\s*br\s*(/\s*)?>){2,}#', '<br>', $subject);

我不完全确定你的版本无法正常工作,但如果上述版本不起作用,可能会有其他内容发生。

答案 6 :(得分:0)

找到答案。我太蠢了。

在另一个文件中我有

define("ALLOWED_TAGS", ""); ... ... ... define("ALLOWED_TAGS", "my tags blah blah blah");

抱歉浪费每个人的时间。 GG

答案 7 :(得分:0)

尽可能使用str_replace。鉴于您对只需1 <br><br><br><br><br><br><br><br><br><br><br>替换<br>等内容的评论,请执行以下操作:

while(strpos($inputstring,'<br><br>'))  //while <br><br> can be found in string
{
    $inputstring = str_replace('<br><br>', '<br>', $inputstring);  //replace <br><br>
}

PHP对正则表达式的实现很糟糕,并且它们在PHP中花费的时间比它的字符串操作要长得多。比较整整一个数量级更长的时间。

要捕捉标签的各种潜在问题,您可以执行以下操作:

$searchArray = array('<br><br>','<br /><br />','other potential spellings');
while(stripos($inputstring,$searchArray))  //while case insensitive search strings are in string
{
    $inputstring = str_ireplace($searchArray, '<br />', $inputstring);  //replace case insensitive strings
}

您也可以仅使用strip_tags删除所有不需要的标记:

$inputstring = strip_tags($inputstring, '<p><a><b><i><other allowed tags>');

但是,当然,这会删除所有<br>代码。