str_replace仅匹配第一个实例

时间:2010-06-17 18:06:58

标签: php preg-match-all str-replace

Get all text between tags with preg_match_all() or better function?

的后续问题

鉴于以下POST数据:

2010-June-3
<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-1

我只想删除2010年6月3日的第一个实例,但以下代码会删除所有数据。

$i = 1;
$pattern = "/<remove>(.*?)<\/remove>/";
preg_match_all($pattern, $_POST['exclude'], $matches, PREG_SET_ORDER);
    if (!empty($matches)) { 
        foreach ($matches as $match) {
            // replace first instance of excluded data
            $_POST['exclude'] = str_replace($match[1], "", $_POST['exclude'], $i);  
        }
   }

echo "<br /><br />".$_POST['exclude'];

这回声:

<remove></remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-1

它应该回应:

<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-1

1 个答案:

答案 0 :(得分:3)

您需要使用preg_replace()代替:

$_POST['exclude'] = preg_replace( '/' . preg_quote( $match[1], '/' ) . '/', "", $_POST['exclude'], 1, $i );

$ _POST ['exclude']后的变量是limit变量,您可以在上面的链接中看到。

日期字段中不需要preg_quote()函数,但由于它是一个变量,因此可能需要包含特殊的正则表达式字符。