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

时间:2017-12-27 12:54:56

标签: php regex preg-match-all

我正在尝试解析查询字符串并遇到了一些我无法弄清楚的问题。

尝试匹配可以包含<或者>,但是当字符串包含<。

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

示例:

Public Sub getXML()
  Set XML = CreateObject("MSXML2.DOMDocument")
  Dim strXML As String
  strXML = "<xml><ConnectedAP apName='I16:ETH0' iedName='IE16'>    <Address>      <P type='OSI-AP-Title'>1,3,9999,23</P>      <P type='IP'>172.18.12.243</P>      <P type='OSI-AE-Qualifier'>23</P>      <P type='OSI-PSEL'>0001</P>      <P type='OSI-SSEL'>0001</P>      <P type='OSI-TSEL'>00000001</P>    </Address>  </ConnectedAP>  <ConnectedAP apName='S1' iedName='STGK16999997422'>   <Address>      <P type='OSI-AP-Title'>1,3,9999,23</P>      <P type='IP'>172.18.12.24</P>      <P type='OSI-AE-Qualifier'>23</P>      <P type='OSI-PSEL'>00000001</P>      <P type='OSI-SSEL'>0001</P>      <P type='OSI-TSEL'>0001</P>    </Address></ConnectedAP></xml>"
  Call XML.LoadXML(strXML)
  Dim ndXML As Object
  Set ndXML = XML.SelectNodes("//ConnectedAP")
  For i = 0 To ndXML.Length - 1
    MsgBox ndXML(i).getAttribute("iedName")
  Next i

End Sub

按预期退货:

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

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

但只需更换&gt;使用&lt;,给出非常奇怪的输出:

代码:

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>

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

谢谢iainn(该死的你们快!)

我的浏览器正在解释&lt;作为标签的开头,看一下来源,一切都很好。

2 个答案:

答案 0 :(得分:0)

&LT;和&gt;是特殊字符。在它们之前放置一个反斜杠,或者在传入之前在字符串上使用此函数 - http://php.net/manual/en/function.preg-quote.php

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

答案 1 :(得分:0)

您尝试在浏览器中查看print_r输出,并将<解释为HTML标记,直到{{1}结束几行之后。如果您查看页面来源而不是呈现的输出,那么您将看到您期望的结果。

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