preg_match_all空匹配

时间:2015-04-09 23:48:32

标签: php regex

我希望在两个美元符号之间匹配任何字母和下划线,并得到匹配结果。

示例:

我得到<a href="$url$">foo</a>,我希望url$url$

我尝试了以下两种模式

$pattern = "/\$([a-z\_]*)\$/i";
$pattern = "/\$(.*)\$/i"; // well, that's actually not what I want.
preg_match_all($pattern, $line, $matches, PREG_PATTERN_ORDER);

好的,这应该有用 - 至少它在regex101上有效。但是,当我在我的应用程序中测试它时,它不会。我只是得到空的测试结果

array(2) { [0]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } [1]=> array(2) { [0]=> string(0) "" [1]=> string(0) "" } } 
// ...

有什么想法吗?

以下是我用来测试它的示例文本(我每行测试一次)

<li>
    <div class="parent">
        <a href="$application_url$">
            <img preview_image src="$thumbnail$">
            <div class="battle_tag">$btag$</div>
            <div class="class_spec">$spec_one$  /  $spec_two$ $class$</div>
            <div class="item_lvl">ilvl $ilvl$</div>
            <div class="date">$obtained$</div>
        </a>
    </div>
</li>

好吧,因为我对PHP不是很熟悉,所以我会发布代码,如何读取实际的字符串。也许我已经在这里做错了。

$file = file($filename);

for($i=0; $i<count($file); $i++){
    $line = $file[$i];
    preg_match_all("/\$([a-z]*)\$/i", $line, $matches);
    var_dump($matches);
    echo "<br/>";
}

1 个答案:

答案 0 :(得分:2)

在正则表达式周围使用单引号:

preg_match_all('/\$([a-z]*)\$/i', $line, $matches);

也许更好:

preg_match_all('/\$([^\$]+)\$/i', $line, $matches);

单引号将PHP从变量插值模式中取出。通常在双引号字符串中转义$就足够了,但显然不是双引号字符串是正则表达式时。