我有来自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;
答案 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);