我在这里绕圈转。我有这个字符串:
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个匹配?
谢谢!
答案 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