在Regex之后删除换行符和制表符

时间:2011-06-29 09:26:52

标签: php regex codeigniter

我正在对以下HTML代码执行preg_match():

HTML代码:

<div class="phone"> 
        (123) 123-1234
    </div> 

正则表达式:

/<div class="phone">(?<phone>.*?)<\/div>/s

结果:

[phone] => '
                    (617) 547-6670
      '

额外的线条和空格是我想要摆脱的。使用/sm选项不会影响结果。使用str_replace("\n",'',$string)摆脱了一条线,而前面的空格应该是\t个标签。我用str_replace("\n\t\t\t\t",'',$string)摆脱了烦人的东西,但我需要一个更通用的解决方案。

如何删除\n\t,无论有多少?

3 个答案:

答案 0 :(得分:4)

不确定这是否是你想要的,但是trim()会处理字符串每一边的空格,制表符和换行符(但不在字符串中)。

http://php.net/manual/en/function.trim.php

  

字符串修剪(字符串$ str [,字符串$ charlist])

     

此函数返回一个字符串   空白从一开始就被剥夺了   和结束没有第二个   参数,trim()将剥离这些   字符:

" " (ASCII 32 (0x20)), an ordinary space.
"\t" (ASCII 9 (0x09)), a tab.
"\n" (ASCII 10 (0x0A)), a new line (line feed).
"\r" (ASCII 13 (0x0D)), a carriage return.
"\0" (ASCII 0 (0x00)), the NUL-byte.
"\x0B" (ASCII 11 (0x0B)), a vertical tab.

我确实意识到这不会处理像Hello<space><space><space>World这样的东西,但它可能就是你所追求的(在正则表达式之外)。

答案 1 :(得分:3)

最简单的方法是使用\s*填充正则表达式的“内容”部分,如下所示:

/<div class="phone">\s*(?<phone>.*?)\s*<\/div>/s

第一个\s*消耗尽可能多的空白字符,当它看到电话号码中的第一个字符时停止。然后.*?开始不情愿地消耗字符,停在正则表达式的下一部分(\s*<\/div>)可以匹配的第一个位置,这就在电话号码的最后一个字符之后。

请注意,第一个\s* 必须贪婪且命名组中的.*?必须非贪婪才能使其正常工作。因此,如果您开始感觉到使用/U选项使所有量词变得非贪婪的冲动,请抵制它。我之所以提到这一点,是因为有些人会使用它们所有的正则表达式,我认为这是一种糟糕的做法。此外,/s(单行)修饰符是必需的,但/m(多行)修饰符不是。

答案 2 :(得分:2)

使用\s*

\s是一个空白字符,*表示任意数量的包含0

但我认为你应该寻找一个HTML解析器,它可能是更好的解决方案。