正则表达式可以在之前或之后替换字符,但不能同时替换两者

时间:2014-07-02 09:22:20

标签: php regex

我试图从字符串中删除一个跨度,并在之前或之后删除其中一个短划线:

1-2-3-<span>4</span>-5-6   => 1-2-3-5-6

但是,跨度可以位于此字符串的任何位置:

<span>1</span>-2-3-4-5-6   => 2-3-4-5-6

1-2-3-4-5-<span>6</span>   => 1-2-3-4-5

所以我需要的是一个正则表达式来删除整个范围,包括其中一个破折号(但不是两个),以维护字符串的正确语法(短划线数字)。

这种模式有效,但必须有一种更简单,更好的方式:

'#-<span>[^>]+>|<span>[^>]+>-#'

我感谢任何提示! 皮特

3 个答案:

答案 0 :(得分:1)

试试这个:

#-<[^-]+>|<[^-]+>-#

它还在工作,而且还小一些!

答案 1 :(得分:0)

如果你想要这样的输出 - 1-2-3-4-5-6,那么你可以使用strip_tags方法:

echo strip_tags('<span>1</span>-2-3-4-5-6');
echo strip_tags('1-2-3-<span>4</span>-5-6');
echo strip_tags('1-2-3-4-5-<span>6</span>');

答案 2 :(得分:0)

检查此演示:

http://codepad.org/0qsK3jmH

使用您在问题中提到的任何输入字符串集,屏幕上会显示所需的答案。

这将涵盖所有情况,其中带数字的跨度可以介于开头或结尾之间。

PHP代码:

<?php
$input = "<span>4</span>-1-2-3-5-6";
 $processed1 = preg_replace("/<span>(\d+)<\/span>/", '',$input );
$processed2 = preg_replace("/--/", '-',$processed1);
$processed3 = preg_replace("/^-/", '',$processed2);
$output = preg_replace("/-$/", '',$processed3);
echo $output;



?>