[英]how to extract a portion of a string in php
我正在使用preg_replace()进行一些字符串替换。
$str = "<aa>Let's find the stuff qwe in between <id>12345</id> these two previous brackets</h>";
$do = preg_match("/qwe(.*)12345/", $str, $matches);
哪个工作正常,并给出以下结果
$match[0]=qwe in between 12345 $match[1]=in between
但我使用相同的逻辑从以下字符串中提取。
<text>
<src><![CDATA[<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="36" COLOR="#999999" LETTERSPACING="0" KERNING="0">r1 text 1 </FONT></P></TEXTFORMAT>]]></src>
<width>45%</width>
<height>12%</height>
<left>30.416666666666668%</left>
<top>3.0416666666666665%</top>
<begin>2s</begin>
<dur>10s</dur>
<transIn>fadeIn</transIn>
<transOut>fadeOut</transOut>
<id>E2159292994B083ACA7ABC7799BBEF3F7198FFA2</id>
</text>
我想从中提取字符串
r1text1
至
</id>
我目前拥有的正则表达式是:
preg_match('/r1text1(.*)</id\>/', $metadata], $matches);
其中$ metadata是上面的字符串..
$ match不会返回任何内容....出于某种原因......我该怎么做? 提前致谢
如果要提取文本,可能需要使用preg_match
。 以下可能有效:
preg_match('#\<P[^\>]*\>\<FONT[^\>]*\>(.*\</id\>)#', $string, $matches)
无论在parantheses中匹配的是什么,都可以在$matches
数组中找到。 在这种情况下, <P>
标签后跟一个<FONT>
标签和</id>
,包括后者。
以上正则表达式未经测试,但可能会让您大致了解如何执行此操作。 如果您的需求有点不同,请调整:)
即使不知道为什么你会在不完整的XML片段上匹配正则表达式(从<![CDATA[
并在结束XML标记</id>
之前结束</id>
,你的正则表达式确实存在三个明显的问题:
正如Amri所说:你必须转义结束XML标记中的/
字符,因为你使用/
作为模式分隔符。 顺便说一下,你不必逃避>
字符。 这给你: '/r1text1(.*)<\\/id>/'
'#r1text1(.*)</id>#'
'/r1text1(.*)<\\/id>/'
或者你可以将模式分隔符更改为#
例如: '#r1text1(.*)</id>#'
(我将使用第一个模式进一步发展表达)。
正如Rich Adams已经说过:示例数据中的文本是“ r1_text_1
”( _
是空格字符),但是您匹配'/r1text1(.*)<\\/id>/'
。 您必须在正则表达式中包含空格或允许不确定数量的空格,例如'/r1(?:\\s*)text(?:\\s*)1(.*)<\\/id>/'
( ?:
是非捕获子模式的语法)
的.
正则表达式中的(点)默认情况下与换行符不匹配。 你必须添加s
(PCRE_DOTALL)模式修饰符才能让.
(点)与换行符匹配: '/r1(?:\\s*)text(?:\\s*)1(.*)<\\/id>/s'
: '/r1(?:\\s*)text(?:\\s*)1(.*)<\\/id>/s'
: '/r1(?:\\s*)text(?:\\s*)1(.*)<\\/id>/s'
)1(。*)/ '/r1(?:\\s*)text(?:\\s*)1(.*)<\\/id>/s'
您可能需要解析字符串/文件并提取FONT标记之间的值。 然后将值插入id标记
尝试谷歌搜索PHP解析。
试试这个
preg_match('/r1text1(.*)<\/id\>/', $metadata], $matches);
您使用/作为模式分隔符,但您的内容具有/ in。 您可以使用\\作为转义字符。
在示例中,您有“r1 text 1”,但您的正则表达式具有“r1text1”。 正则表达式不匹配,因为您尝试将其匹配的字符串中有空格。 您应该在正则表达式中包含空格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.