在 php preg_match_all 中使用小于 (<) 运算符时遇到问题

Having trouble with less than(<) operator in php preg_match_all

我正在尝试解析一个查询字符串并将 运行 变成我不太明白的东西。

尝试匹配可以包含 < 或 > 的字符串,但只有当字符串包含 <.

时我才会看到一些奇怪的输出

示例:

<?php
$gt = 'wt>f';
preg_match_all("/([A-Za-z<>]+)/", $gt, $gtmatches);
?>

<pre><?php print_r($gtmatches); ?></pre>

Returns 符合预期:

Array
(
    [0] => Array
        (
            [0] => wt>f
        )

    [1] => Array
        (
            [0] => wt>f
        )
)

但只需将 > 替换为 <,就会产生非常奇怪的输出:

代码:

<?php
$lt = 'wt<f';
preg_match_all("/([A-Za-z<>]+)/", $lt, $ltmatches);
?>

<pre><?php print_r($ltmatches); ?></pre>

输出:

Array
(
    [0] => Array
        (
            [0] => wt Array
        (
            [0] => wt

我已经在 PHP 5.6.24/IIS 10 和 PHP 5.6.32/Apache 2.4.29 上进行了本地测试。

感谢iainn解决了(妈的你们真快!)

我的浏览器将 < 解释为标记的开头,查看源代码,一切正常。

<和>是特殊字符。在它们中的每一个之前放置一个反斜杠,或者在它传入之前在字符串上使用这个函数 - http://php.net/manual/en/function.preg-quote.php

preg_match_all("/([A-Za-z\<\>]+)/", $gt, $gtmatches);

您正在尝试在浏览器中查看 print_r 输出,它会将 < 解释为 HTML 标记,直到 => 几行之后。如果您查看页面源代码而不是呈现的输出,您将看到您期望的结果。

如评论中所述,正则表达式本身工作正常。