使用PHP RegExp从撇号之间剥离字符串

时间:2014-03-21 17:16:10

标签: php regex

我在这里绕圈转。我有这个字符串:

document.write('£222,648.43');

我想用php / regexp结束222,648.43

这是我到目前为止最接近的地方:

preg_match('/\(\'(.*)\'\)/', $str, $matches);
var_dump($matches);

vardump给了我:

array (size=2)
  0 => string '('£222,648.43')' (length=15)
  1 => string '£222,648.43' (length=11)

那么..如何摆脱那个'£'字符好吗?

另外,作为帮助我了解更多有关regexp的奖励,为什么要返回2个匹配?

谢谢!

4 个答案:

答案 0 :(得分:1)

why are 2 matches returned?

因为一个来自捕获的组( )而另一个来自与您的字符串匹配的整个模式。

使用preg_replace

$content = preg_replace("/document\.write\('\D?([\d.,]+)'\);/", "$1", $content);

在这里,它将数字抓取到组$1中并用此捕获替换整个字符串。

或者你也可以使用这个:

$content = preg_replace("/.*\('\D?([\d.,]+)'.*/", "$1", $content);

答案 1 :(得分:1)

返回的第一个匹配将是整个正则表达式的匹配。第二个是第一个捕获组,在括号中。

如果你想删除开头引号之后的第一个字符,你可以在括号中的捕获部分之前使用.来匹配任何字符:

'/\(\'.(.*)\'\)/'

如果只是'£'字符需要消除它,你可以在进入捕获组之前添加£?,以选择性地匹配符号:

'/\(\'£?(.*)\'\)/'

如果您需要消除其他可能的货币符号作为该点,您可以将它们包含在[£$€¥₪₩₤﷼]等字符类中,例如:

'/\(\'[£$€¥₪₩₤﷼]?(.*)\'\)/'

答案 2 :(得分:0)

这是一种相反的方式:

$string = "document.write('£222,648.43');";
$value = preg_replace("/[.,]*[^\d,.]+[.,]*/", "", $string);

答案 3 :(得分:0)

您可以使用:

$str = "document.write('£222,648.43');";
echo preg_replace_callback("~^.*?\( *'([^']+)' *\).*?$~", function($m) {
       return preg_replace('~[^\d,.]+~', '', $m[1]);
    }, $str); 
//=> 222,648.43