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


Stripping a string from between apostrophes with PHP RegExp

我在这里转来转去。我有这个字符串:

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个匹配项?

谢谢!

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

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

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

如果您只需要在"£"字符的情况下消除它,则可以在进入捕获组之前添加£?,以选择性地匹配符号:

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

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

'/'(''[£$€¥₪₩₤﷼]?(.*)''')/'
why are 2 matches returned?

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

使用preg_replace

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

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

或者你也可以使用这个:

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

您可以使用:

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

这里有一种相反的方法:

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