使用正则表达式删除php中字符串中的空格

时间:2014-05-05 11:12:56

标签: php regex

我想通过php中的正则表达式删除html标记之间的空格。我可以知道规则是什么吗?不删除文本中的空格。

例如,我想删除<tr><td>标记之间的空格。

自:

<tr>
    <td>Hello there</td>
<tr>

为:

<tr><td>Hello there</td></tr>

感谢。

3 个答案:

答案 0 :(得分:2)

首先关闭:markup (HTML) and regex don't mix well。尽管如此,你可以删除标签之间的空格,并且很容易使用以下正则表达式:

$clean = preg_replace('/>\s+</', '><', $string);

如果之间没有其他内容,这将删除标签之间找到的空格:

<p>Foobar <b>is</b> not a word <i>as such</i>    <p>

“翻译”进入:

<p>Foobar <b>is</b> not a word <i>as such</i><p>

这很好,但是,使用DOMDocument类解析,清理然后回显标记会更好(也更安全)。但是在你开始攻击之前,编写成千上万行代码来确保你正在处理有效的标记时,问问自己这个简单的问题:

如何确保我正在处理的标记格式正确,并且开始时有效?

不要编写适用于不良标记的代码,而是要考虑确保您正在处理的数据具有良好质量的方法。
无论如何,这是一个如何使用DOMDocument类的简单示例:

$dom = new DOMDocument;
$dom->loadHTML($string);
echo $dom->saveHTML();//echoes sanitized markup

这假定$string是一个完整的DOM(包括<html>,doctype和所有其他隐含的标记)。如果您没有这样的字符串,则必须使用saveXML

echo $dom->getElementsByTagName('body')->item(0)->saveXML();

其中body是标记的根节点。有关示例和详细信息,请参阅the docs

如果您拥有的字符串是您在问题中包含的内容,则需要删除所有空格。在这种情况下,正则表达式只是不必要

$string = '<tr>
     <td>';
echo str_replace(' ', '', $string);//removes all spaces...

好吧,浏览DOMDocument课程的文件,值得付出努力。诚实:)

答案 1 :(得分:1)

这个问题比它看起来更复杂。删除所有标记之间的所有空格很容易,例如

<tr>  <td>   -> <tr><td>

但这种天真的做法会产生错误的结果:

<i>hi</i> <b>there</b>  -> <i>hi</i><b>there</b>

要正确删除空白 ,您必须分析其父节点的类型,并仅在节点不允许文本内容时删除(http://www.w3.org/TR/html4/sgml/dtd.html可能有用)。< / p>

绝对不是你能用正则表达式实现的东西!

答案 2 :(得分:0)

$str = "<td> </td>";
$str2 = "<td></td>";

var_dump(preg_match('/\s/',$str));
var_dump(preg_match('/\s/',$str2));

结果1返回true

结果2返回false