如何在php中提取字符串的一部分

时间:2009-04-10 06:39:46

标签: php regex text-extraction

我正在使用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不会返回任何内容.... 出于某种原因......我该怎么做? 提前致谢

5 个答案:

答案 0 :(得分:2)

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

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

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

以上正则表达式未经测试,但可能会让您大致了解如何执行此操作。如果您的需求有所不同,请进行调整:)

答案 1 :(得分:1)

即使不知道为什么你会在一个不完整的XML片段上匹配正则表达式(从<![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. 默认情况下,正则表达式中的.(点)与换行符不匹配。您必须添加s(PCRE_DOTALL)模式修饰符,以使.(点)与新行匹配:'/r1(?:\s*)text(?:\s*)1(.*)<\/id>/s'

答案 2 :(得分:0)

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

尝试谷歌搜索PHP解析。

答案 3 :(得分:0)

试试这个

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

您使用/作为模式分隔符,但您的内容包含/。您可以使用\作为转义字符。

答案 4 :(得分:0)

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