У меня есть вход из таблицы HTML.
Сначала замените требуемый интервал на ‘_’. Затем заменив теги HTML пробелами, чтобы я мог извлечь информацию по столбцам.
Я хочу, чтобы мой вывод был:
100 Request_in_progress Pending_response 789653686
Вместо этого вывод добавляет дополнительный интервал, как это
$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;
Это происходит потому, что regex
это неверно.
В регулярных выражениях вертикальная черта (|
) объединяет альтернативные пути.
Выражение <td>||</td>
средства «<td>
ИЛИ ЖЕ пустая строка ИЛИ ЖЕ </td>
«(и так далее, но остальное уже не имеет значения).
Соответственно, ваш regex
соответствует всем содержащимся в нем тегам HTML, но также соответствует пустым строкам между любыми двумя последовательными символами во входной строке.
Правильный regex
является <td>|</td>|<tr>|</tr>|<th>|</th>
,
$tags = '#<td>|</td>|<tr>|</tr>|<th>|</th>#';
$result = preg_replace($tags, ' ', $rmSpace);
Пример того, как вы достигаете этого, используя простой 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);