在单个php中合并两个正则表达式

时间:2014-07-05 05:21:43

标签: php regex

我需要知道是否有任何方法可以将两个正则表达式合并为一个正则表达式。最近我不得不制作以下PHP代码,但我觉得有一种简化的方法来实现这一点,而不使用多个preg_replace 标签。我要做的是剥离  & ©等..并删除所有多个空格

$textinput = 'this is a test input       \'     """"""    """" @#$$%&*)_+!@#$%^&*)   123          456';

$var = preg_replace("/&#?[a-z0-9]{2,8};/i",'',$textinput)
$string = preg_replace('/\s+/', ' ', $var);

输出

this is a test input ' """""""""" @#$$%&*)_+!@#$%^&*) 123 456

我知道php中的html_entity_decode函数可以删除特殊字符,这只是一个例子!如何将两个正则表达式合并为一个?< / p>

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用逻辑OR运算符组合两个正则表达式

(?:&#?[a-z0-9]{2,8};)+|(?<=\s)\s+

您的代码将是,

<?php
$mystring = 'this is a test input       \'     """"""    """" @#$$%&*)_+!@#$%^&*)   123    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;456';
$pattern = "~(?:&#?[a-z0-9]{2,8};)+|(?<=\s)\s+~";
$replacement = "";
echo preg_replace($pattern, $replacement, $mystring);
?>

<?php
$mystring = 'this is a test input       \'     """"""    """" @#$$%&*)_+!@#$%^&*)   123    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;456';
$pattern = "~&#?[a-z0-9]{2,8};|(?<=\s)\s+~";
$replacement = "";
echo preg_replace($pattern, $replacement, $mystring);
?>

输出:

this is a test input ' """""" """" @#$$%&*)_+!@#$%^&*) 123 456

答案 1 :(得分:2)

$var = preg_replace_callback('/&#?[a-z0-9]{2,8};|\s+/i', function($match) {
    return $match[0][0] === '&' ? '' : ' ';
}, $textinput);

答案 2 :(得分:2)

这将在一个有效步骤中完成两次替换(不会丢失空白字符):

$replaced = preg_replace('~(?:&#?[a-z0-9]{2,8};)+|\s\K\s+~', '', $yourstring);

the demo上,查看所有额外字符的定位方式。

<强>解释

  • |的左侧,(?:&#?[a-z0-9]{2,8};)+定位目标群体,例如&nbsp;,而不是一次只有一个,但如果他们正在接触,则会在一起。
  • 在右侧,\s匹配一个空格,然后\K告诉引擎将其从匹配中删除(它不会被替换),然后\s+匹配
  • 之后的任何空白字符
  • 我们用空字符串替换。