簡體   English   中英

正則表達式可在某些服務器上運行,而在其他服務器上則不行

[英]Regular expression works on some servers and not others

我在調試正則表達式時遇到問題。 首先,編寫代碼(這是完整的文件...抱歉,缺少換行符-有關pastebin的信息,請參見http://pastebin.com/h5CeiY5F ):

<?php
$matches = null;
$returnValue = preg_match('#" FirstDownType="[A-Z][0-9]+"/><Play PlayDescription="Penalty[^<]+/>#', '<Play DownDistanceYardline="3-1-GB 7" EarnedFirstDown="False" PlayDescription="(3:40) 71-C.Brown reported in as eligible. 28-M.Ingram left guard to GB 7 for no gain (94-J.Wynn; 95-H.Green)."/><Play DownDistanceYardline="4-1-GB 7" EarnedFirstDown="False" PlayDescription="(3:10) 9-D.Brees pass incomplete short left to 23-P.Thomas."/><Play Header="Green Bay Packers at 3:02"/><Play DownDistanceYardline="1-10-GB 7" EarnedFirstDown="False" PlayDescription="(3:02) 44-J.Starks right tackle to GB 11 for 4 yards (94-C.Jordan)."/><Play DownDistanceYardline="2-6-GB 11" EarnedFirstDown="False" PlayDescription="(2:26) 12-A.Rodgers pass deep right to 85-G.Jennings pushed ob at GB 33 for 22 yards (33-J.Greer)." FirstDownType="P17"/><Play PlayDescription="Penalty on NO-33-J.Greer, Defensive Pass Interference, declined."/><Play DownDistanceYardline="1-10-GB 33" EarnedFirstDown="True" PlayDescription="(2:01) (Shotgun) 12-A.Rodgers pass short left to 85-G.Jennings to GB 47 for 14 yards (21-P.Robinson)." FirstDownType="P18"/><Play DownDistanceYardline="1-10-GB 47" EarnedFirstDown="True" PlayDescription="(1:22) 12-A.Rodgers pass short right to 87-J.Nelson pushed ob at NO 44 for 9 yards (27-M.Jenkins)."/><Play DownDistanceYardline="2-1-NO 44" EarnedFirstDown="False" PlayDescription="(:47) 44-J.Starks right tackle to NO 42 for 2 yards (51-J.Vilma; 94-C.Jordan)." FirstDownType="R19"/><Play DownDistanceYardline="1-10-NO 42" EarnedFirstDown="True" PlayDescription="(:07) 25-R.Grant right tackle to NO 40 for 2 yards (51-J.Vilma, 58-S.Shanle)."/><QuarterSummary Team="New Orleans Saints" Score="27" TimeOfPossession="10:47" FirstDownsRushing="3" FirstDownsPassing="5" FirstDownsPenalty="1" FirstDownsTotal="9" ThirdDownEfficiency="1/3" FourthDownEfficiency="0/1"/><QuarterSummary Team="Green Bay Packers" Score="35" TimeOfPossession="4:13" FirstDownsRushing="1" FirstDownsPassing="2" FirstDownsPenalty="0" FirstDownsTotal="3" ThirdDownEfficiency="0/1" FourthDownEfficiency="0/0"/>', $matches);
print_r($matches);

當我在幾個沙箱(例如http://sandbox.onlinephpfunctions.com/或functions-online.com/preg_match.html)上運行此代碼時,它返回:

Array ( [0] => " FirstDownType="P17"/><Play PlayDescription="Penalty on NO-33-J.Greer, Defensive Pass Interference, declined."/> )

那就是我想要的預期輸出。

但是,當我在服務器上運行它(並且已經在兩個不同的服務器上對其進行測試)時,我得到:

Array ( [0] => " FirstDownType="P17"/> )

我能想到的是preg_match在PHP 5.3.10(沙盒上的版本)和PHP 5.3.6(我們的版本)之間更改了,還是我們的Ubuntu版本配置錯誤?

我真的很感謝您的幫助。 謝謝!

您是否需要使用正則表達式進行匹配? 如何使用XML解析器呢?

嘗試使用SimpleXML獲取所需的節點。

$sXML = new SimpleXMLElement('<xml>'.$xml.'</xml>');

然后,您可以使用XPath查找所需的元素。

$play = $sXML->xpath('//Play[starts-with(@PlayDescription, "Penalty")]/preceding-sibling::Play[@FirstDownType]');

這將選擇Play元素之前的Play元素,該Play元素的Play PlayDescription"Penalty"開頭。

演示: http : //codepad.viper-7.com/ECQKcB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM