开发者

php and regular expressions

Ok i have tried this quite a few times now. I still cannot figure it out.

Thisis my problem. I want开发者_JAVA技巧 to take any <br><br> and turn it into <br>

So this is what i do

$test = ereg_match("/<br><br>/", "<br>", "<br><br>Test<br><br>"); echo $test;

It produces $test == "Test" rather than $test = "<br>Test<br>"

Any help? Then i would like to expand it so that any <br\s*\/{0, 1}>\s*<br\s*\/{0, 1}> So that any two seperated by space can be turned into 1. Any help?


You can just use str_replace

<?php

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

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

Update

Example:

http://codepad.org/MWzg81Qy

To replace 2 or more br's(with unlimited spacing)... you can do preg_replace:

<?php

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

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

http://codepad.org/CrltyhSs


Perhaps not the answer you're after but using str_replace will be considerably more efficient than a regular expression.

i.e.: $test = str_replace('<br><br>', '<br>', $sourceString);

Incidentally, I'd be tempted to replace the <br> tags with <br /> in this day and age as well. :-)


You most certainly have a typo in your function names. The preg_* functions have mostly replaced the old ereg_ functions.

Your second regex should be written as:

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

The ? is shorthand for your {0,1}, and by using # as delimiter you spare the extraneous escaping of forward slashes.


Can you try this:

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>"


As Mike Lewis says, use string manipulation if you don't need to account for variation in the input string. On the other hand, if you want to collapse any multiple <br> or <br/> tags into a single tag, allowing for whitespace inside them, this should work for you:

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

I'm not totally sure why your version isn't working, but if the above doesn't work, there's probably something else going on here.


Found the answer. I am so stupid.

In a seperate file i had

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

Sorry for wasting everyones time. GG


Exactly 2 BR separated by optional whitespace:

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

2 or more BR separated by optional whitespace:

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


Use str_replace where you can. Given your comments on stuff such as wanting to replace <br><br><br><br><br><br><br><br><br><br><br> with just 1 <br>, do this:

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

PHP has a bad implementation of regular expressions, and they take a much much longer time to do in PHP than it's string manipulations. Like a whole greater order of magnitude time longer.

To catch various different potential issues with the tags, you can do:

$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
}

You can also use strip_tags just to remove any unwanted tags all together:

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

But, of course, this would remove all <br> tags.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜