как извлечь часть строки в php - PullRequest
3 голосов
/ 10 апреля 2009

Я использую 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 ]

2 голосов
/ 10 апреля 2009

Если вы хотите извлечь текст, вы, вероятно, захотите использовать preg_match. Может работать следующее:

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

Все, что сопоставляется в парантезах, можно найти позже в массиве $matches. В этом случае все между тегом <P>, за которым следует тег <FONT> и </id>, включая последний.

Вышеупомянутое регулярное выражение не проверено, но может дать вам общее представление о том, как это сделать. Приспособьтесь, если ваши потребности немного отличаются:)

1 голос
/ 10 апреля 2009

Даже если вы не знаете, почему вы хотите сопоставить регулярное выражение с неполным фрагментом XML (начиная с <![CDATA[ и заканчивая непосредственно перед закрывающим тегом XML </id>, у вас есть три очевидные проблемы с регулярным выражением:

  1. Как сказал Амри : вам нужно экранировать символ / в закрывающем теге XML, потому что вы используете / в качестве разделителя шаблона. Кстати, вам не нужно экранировать символ >. Это дает вам: '/r1text1(.*)<\/id>/' В качестве альтернативы вы можете изменить разделитель шаблона на #, например: '#r1text1(.*)</id>#' (я буду использовать первый шаблон для дальнейшей разработки выражения).

  2. Как уже сказал Рич Адамс : текст в вашем примере данных "r1_text_1" (_ - пробел), но вы соответствуете '/r1text1(.*)<\/id>/'. Вы должны включить пробелы в свое регулярное выражение или учесть неопределенное количество пробелов, например '/r1(?:\s*)text(?:\s*)1(.*)<\/id>/' (?: - это синтаксис для неподдерживаемых подшаблонов)

  3. * . (точка) в вашем регулярном выражении не соответствует символам новой строки по умолчанию. Вы должны добавить модификатор шаблона s (PCRE_DOTALL), чтобы . (точка) также совпадал с символами новой строки: '/r1(?:\s*)text(?:\s*)1(.*)<\/id>/s'

0 голосов
/ 10 апреля 2009

В примере у вас есть "r1 текст 1", а у вашего регулярного выражения - "r1text1" Регулярное выражение не совпадает, потому что в строке есть пробелы, с которыми вы пытаетесь сопоставить его. Вы должны включить пробелы в регулярное выражение.

0 голосов
/ 10 апреля 2009

попробуйте

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

Вы используете / в качестве разделителя шаблонов, но ваш контент имеет / в. Вы можете использовать \ как escape-символ.

0 голосов
/ 10 апреля 2009

вам, вероятно, нужно проанализировать вашу строку / файл и извлечь значение между тегом FONT. Затем вставьте значение в тег id

Попробуйте поискать в Google для разбора php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...