Preg_replace добавляет ненужный пробел между ВСЕМИ символами

У меня есть вход из таблицы 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;

-1

Решение

Это происходит потому, что 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);
1

Другие решения

Пример того, как вы достигаете этого, используя простой 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);
0

По вопросам рекламы [email protected]