>之间的preg_replace和<

时间:2010-12-04 17:40:36

标签: php regex preg-replace

我有这个:

<div> 16</div>

我想要这个:

<div><span>16</span></div>

目前,这是我能让它发挥作用的唯一方法:

preg_replace("/(\D)(16)(\D)/", "$1<span>$2</span>$3", "<div> 16</div>")

如果我放弃3美元,我会得到:

<div><span>16</span>/div>

4 个答案:

答案 0 :(得分:3)

不太确定你的追求,但以下更通用:

$value = "<div>    16    </div>";
echo(preg_replace('%(<(\D+)[^>]*>)\s*([^\s]*)\s*(</\2>)%', '\1<span>\3</span>\4', $value));

哪会导致:

<div><span>16</span></div>

即使价值是:

<p>    16    </div>

这将导致:

<p><span>16</span></p>

答案 1 :(得分:2)

我想你的意思是说你正在使用以下内容:

print preg_replace("/(\\D+)(16)(\\D+)/", "$1<span>$2</span>$3", "<div>16</div>");

这没什么不对。 $ 3将包含第二个(\ D +)组中匹配的所有内容。如果你把它关掉,显然它不会神奇地出现。

请注意,问题中的代码存在一些错误:

  1. 您需要在字符串中转义\
  2. 您需要使用\D+来匹配多个字符。
  3. 你的字符串中有一个16之前的空格,但你没有在你的正则表达式中考虑到这一点。我删除了空格,但是如果你想允许它,你应该使用\s*匹配任意数量的空白字符。
  4. 参数的顺序不正确。

答案 2 :(得分:1)

尝试以下操作 -

$str = "<div class=\"number\"> 16</div>";
$formatted_str = preg_replace("/(<div\b[^>]*>)(.*?)<\/div>/i", "$1<span>$2</span></div>", $s);
echo $formatted_str;

答案 3 :(得分:0)

这就是最好的工作:

preg_replace('/(<.*>)\s*('. $page . ')\s*(<.*>)/i', "$1" . '<span class="curPage">' . "$2" . '</span>' . "$3", $pagination)

我发现的是我不确定在页码之前或之后会有哪些标签。