正则表达式内部 str_replace

Regex Inside str_replace

我需要下面的 str_replace 代码行仅在 <td></td> 中匹配,其中也会有其他随机内容(所以可能需要通配符?)。我假设涉及一些正则表达式,但我无法使其工作。代码有效,但我只是希望它在我的 table 与整个页面中有效。

作为参考,当自动换行出现在 table.

中时,包含此代码的较大代码段将较长的产品规格在连字符处分成两行,而不是在奇怪的地方

例如:(16 x 20 x 18 (406 x 508 x 457) - 24 x 36 x 18 (711 x 914 x 457)

$html = str_replace( ') - ', ') - <br />', $html );

即使输入我们所有数据的人出于某种原因没有在连字符周围使用空格,或者可能不小心在一侧或另一侧使用了空格,如果它也有效,那就太好了。我认为总会有括号。

谢谢!

听起来你需要 preg_replace() 而不是 str_replace()

试试这个:

<?php
$regex = "/^(<td.*?>)(.*?)\s*-\s*(.*)(<\/td>)$/i";
$html = '<td class="someClass">16 x 20 x 18 (406 x 508 x 457) - 24 x 36 x 18 (711 x 914 x 457)</td>';
$htmlOut = preg_replace($regex,' - <br>', $html, -1, $replacements);

echo "Initial string: ".htmlentities($html)."<br>";
echo "Replacements: ".$replacements.'<br>';
echo "Output: ".htmlentities($htmlOut);

?>

输出:

Initial string: <td class="someClass">16 x 20 x 18 (406 x 508 x 457) - 24 x 36 x 18 (711 x 914 x 457)</td>
Replacements: 1
Output: <td class="someClass">16 x 20 x 18 (406 x 508 x 457) - <br>24 x 36 x 18 (711 x 914 x 457)</td>

这里的关键是从原始字符串中捕获部分并在以后重新组合它们。四个捕获组按顺序捕获前导 <td> 标记(包括属性)、连字符左侧的文本、连字符右侧的文本、结束 </td> 标记。请注意,连字符以及任一侧的任意数量的空格都被匹配但未被捕获。

重新组装时,只需连接各个捕获的组并插入您想要的任何内容,而不是连字符。

请注意,这是非常具体地使用正则表达式来解析特定的 HTML 标记。您通常不应使用正则表达式来解析 HTML。请参阅 here 了解可能发生的情况。