【问题标题】:Stripping a string from between apostrophes with PHP RegExp使用 PHP RegExp 从撇号之间剥离字符串
【发布时间】:2014-03-22 01:32:12
【问题描述】:

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

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)

那么..请问如何摆脱那个'£'字符?

另外,作为帮助我了解更多关于正则表达式的奖励,为什么返回 2 个匹配项?

谢谢!

【问题讨论】:

    标签: php regex


    【解决方案1】:

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

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

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

    如果只需要去掉'£'字符,可以在进入捕获组前添加£?,可选匹配符号:

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

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

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

    【讨论】:

    • 非常感谢,我使用了最后一个,因为这将涵盖更多具有多种货币的基础。
    【解决方案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);
    

    【讨论】:

    • 感谢双重匹配的解释。
    【解决方案3】:

    你可以使用:

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

    【讨论】:

    • 谢谢,我选择了一种更简单的解决方案,但非常感谢您抽出宝贵时间。
    【解决方案4】:

    这是一种相反的方法:

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

    【讨论】:

    • 你忘记了“document”和“write”之间的点。
    • 嗨,谢谢,我采用了另一种解决方案,但很高兴看到它也可以像这样倒退。
    猜你喜欢
    • 2016-11-04
    • 2011-06-18
    • 2019-04-08
    • 1970-01-01
    • 2010-09-19
    • 2012-09-30
    • 2020-11-15
    • 2017-11-28
    • 2018-04-20
    相关资源
    最近更新 更多