我正在尝试解析查询字符串并遇到了一些我无法弄清楚的问题。
尝试匹配可以包含<或者>,但是当字符串包含<。
时,我才会看到一些奇怪的输出示例:
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;作为标签的开头,看一下来源,一切都很好。
答案 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}结束几行之后。如果您查看页面来源而不是呈现的输出,那么您将看到您期望的结果。
正如评论中所提到的,正则表达式本身工作正常。