Preg_replace在所有字符之间添加不需要的空格

时间:2018-01-26 09:47:41

标签: php regex html-table preg-replace removing-whitespace

我有来自HTML表的输入。 首先用'_'替换所需的间距。然后用间距替换HTML标签,这样我就可以按列提取信息。

我希望我的输出为:

  

100 Request_in_progress Pending_response 789653686

Instead the output adds extra spacing like this

$testString = '<tr><td>100</td><td>Request in progress</td><td></td><td></td><td>Pending response</td><td>789653686</td><td></td><td></td><td></td></tr>';
$rmSpace = str_replace(' ', '_', $testString);

$tags = '(<td>||</td>||<tr>||</tr>||<th>||</th>)';
$result = preg_replace($tags, ' ', $rmSpace);

echo $result;

2 个答案:

答案 0 :(得分:1)

这是因为regex不正确。

在正则表达式中,the vertical bar (|)加入了替代路径。

表达式<td>||</td>表示&#34; <td>空字符串</td>&#34; (等等,但其余的事情并不重要)。

因此,您的regex会匹配它包含的所有HTML标记,但它也会匹配输入字符串中任意两个连续字符之间的空字符串。

正确的regex<td>|</td>|<tr>|</tr>|<th>|</th>

$tags = '#<td>|</td>|<tr>|</tr>|<th>|</th>#';
$result = preg_replace($tags, ' ', $rmSpace);

答案 1 :(得分:0)

使用简单DOMDocument

实现此目标的示例
$testString = '<tr><td>100</td><td>Request in progress</td><td></td><td></td><td>Pending response</td><td>789653686</td><td></td><td></td><td></td></tr>';
$dom=new DOMDocument;
$dom->loadHTML( $testString );
$col=$dom->getElementsByTagName('td');
$out=array();

if( $col->length > 0 ) foreach( $col as $node )$out[]=str_replace(' ','_',$node->nodeValue);

$out=array_filter($out);
echo implode(' ',$out);