【问题标题】:/ (slash) in preg_match/(斜线)在 preg_match
【发布时间】:2013-08-30 05:46:50
【问题描述】:

我有这部分 some/aaa/9321/something 我只想从中提取 9321。 “某事”总是不同的,“aaa”总是静态的。所以,我用了:

$text = "something/aaa/9321/something";
$first = 'aaa/';
$after = '/';
preg_match("/$first(.*)$after/s",$text,$result);
echo $result;

但不起作用。有人可以告诉我我需要使用什么吗? 我也试过这个:

$text = "something/aaa/9321/something";
$first = 'aaa';
preg_match("|$first(.*)|",$text,$result);
echo substr($result['1'], 1, 4);

但在 aaasomething 之间并不总是 4 个字符。

抱歉英语不好。谢谢!

【问题讨论】:

标签: php preg-match


【解决方案1】:

当您希望在正则表达式中按字面意思获取字符串时,您应该始终使用preg_quote

$text = 'something/aaa/9321/something';
$first = preg_quote('aaa/', '/');
$after = preg_quote('/', '/');
preg_match("/$first(.*)$after/s",$text,$result);
echo $result[1]; // '9321'

Demo

问题是由/ 是您的正则表达式中的分隔符引起的。你也可以通过使用不同的分隔符来解决这个问题,比如~,但是,只要你的字符串有~或任何其他具有特殊含义的字符,比如@987654327,你就会遇到同样的问题@,或?。使用 preg_quote,你不会再遇到这个问题了。

【讨论】:

  • preg_quote我喜欢这个功能+1
【解决方案2】:

您是否尝试过转义/? 而不是

$first = 'aaa/';
$after = '/';

试试

$first = 'aaa\/';
$after = '\/';

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多