将字符串拆分成数组并修剪中间?

时间:2012-02-05 14:32:01

标签: php regex string

我有一个类似这样的字符串:

$str="

<code>

  lol
      test

</code>

test";

我想修剪标签内的文字,以便最终得到:

$str="

<code>lol
      test</code>

test";

有没有办法可以把它拆分成3个数组,所以中间文本上有一个简单的trim()?

非常感谢

2 个答案:

答案 0 :(得分:1)

这应该这样做。它的作用是查找<tag>后跟任意数量的空格和修剪,直到找到另一个非空格字符。然后它会在结束</tag>之前删除任意数量的空格。

preg_replace(array(
    '/(<[a-zA-Z]+>)[[:space:]]*([^[:space:]])/m',
    '/[[:space:]]*(<\/[a-zA-Z]+>)/m',
), array(
    '\1\2',
    '\1',
), $str);

查看实际操作:http://codepad.org/Stmd32QL

修改

这只会查找<code>个标签。

preg_replace(array(
    '/(<code>)[[:space:]]*([^[:space:]])/mi',
    '/[[:space:]]*(<\/code>)/mi',
), array(
    '\1\2',
    '\1',
), $str);

答案 1 :(得分:1)

正则表达式不是正确的解决方案,如果你想获得最好的结果,你应该使用html解析库。但是,如果你对使用正则表达式解析html的问题没问题;这应该这样做:

<?php
$string = "

<code>

  lol
      test

</code>

test";

$pattern = '/(<([a-z]+)>)\s*(.+)\s*(<\/\2>)/ms';

$new_string = preg_replace_callback($pattern, function ($m) {
    return $m[1].trim($m[3]).$m[4];
  }, $string);


var_dump($new_string);

结果:

$ php test.php
string(35) "

<code>lol
      test</code>

test"

请注意,html标记模式在此处为您的示例进行了简化,如果您需要支持诸如<coDe style="color: red;">

之类的内容,则必须对其进行修改。