3

我正在使用 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 在 12345 之间
$match[1]=介于两者之间

但我使用相同的逻辑从以下字符串中提取。

<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 是上面的字符串..

$matches 不返回任何内容....出于某种原因...我该怎么做?提前致谢

4

5 回答 5

2

如果要提取文本,您可能需要使用preg_match. 以下可能有效:

preg_match('#\<P[^\>]*\>\<FONT[^\>]*\>(.*\</id\>)#', $string, $matches)

括号中匹配的任何内容都可以稍后在$matches数组中找到。在这种情况下,<P>标签后跟<FONT>标签和之间的所有内容</id>,包括后者。

上面的正则表达式未经测试,但可能会让您大致了解如何做到这一点。如果您的需求有点不同,请适应:)

于 2009-04-10T07:12:51.370 回答
1

即使不知道为什么要在不完整的 XML 片段上匹配正则表达式(从 a 开始<![CDATA[并在结束 XML 标记之前结束</id>,您的正则表达式确实存在三个明显的问题:

  1. 正如Amri所说:您必须转义/结束 XML 标记中的字符,因为您将/其用作模式分隔符。顺便说一句,你不必逃避这个>角色。这给了您:'/r1text1(.*)<\/id>/'或者,您可以将模式分隔符更改#为例如:('#r1text1(.*)</id>#'我将使用第一个模式来进一步开发表达式)。

  2. 正如Rich Adams已经说过的那样:示例数据中的文本是“ r1_text_1”(_是空格字符),但您匹配'/r1text1(.*)<\/id>/'. 您必须在正则表达式中包含空格或允许不确定数量的空格,例如'/r1(?:\s*)text(?:\s*)1(.*)<\/id>/'(这?:是非捕获子模式的语法)

  3. 默认情况下,正则表达式中的.(dot) 不匹配换行符。您必须添加s(PCRE_DOTALL) 模式修饰符以让.(dot) 也与换行符匹配:'/r1(?:\s*)text(?:\s*)1(.*)<\/id>/s'

于 2009-04-10T09:25:01.723 回答
0

在示例中,您有“r1 text 1”,但您的正则表达式有“r1text1”。正则表达式不匹配,因为您尝试匹配的字符串中有空格。您应该在正则表达式中包含空格。

于 2009-04-10T08:58:30.650 回答
0

您可能需要解析您的字符串/文件并提取 FONT 标记之间的值。然后将值插入到 id 标签中

尝试使用谷歌搜索进行 php 解析。

于 2009-04-10T06:48:37.357 回答
0

尝试这个

preg_match('/r1text1(.*)<\/id\>/', $metadata], $matches);

您正在使用 / 作为模式分隔符,但您的内容有 / in 。您可以使用 \ 作为转义字符。

于 2009-04-10T08:18:56.110 回答