Синтаксис регулярного выражения В PHP для извлечения всех экземпляров формата - PullRequest
0 голосов
/ 08 мая 2009

Я пытаюсь извлечь все экземпляры определенного формата из строки:

Мне интересно, будет ли моя новая Sony [PT # 123456ABC; Sony] имеет эту функцию, но мой друг говорит, что новый Toshiba [PT # AD-3232hjk; Toshiba] имеет эту функцию.

Я хотел бы извлечь:

[PT # 123456ABC; Sony]

[PT # AD-3232hjk; Toshiba]

Как вы можете видеть здесь, единственные позиции в последовательных позициях:

  • [PT #
  • ;

Я пытался использовать различные типы strpos (), но из-за разной длины и форматов номеров деталей и названий производителей я не смог надежно извлечь эти экземпляры из гораздо большей строки. Я пытался различными способами использовать регулярные выражения для решения этой проблемы, однако мои знания с ними довольно ограничены. После того, как эти выражения извлечены и помещены в переменные, мне нужно будет отделить номера деталей и имена производителей от выражения. Это также может быть проще сделать с помощью регулярных выражений.

Любая помощь приветствуется. Спасибо

Ответы [ 3 ]

1 голос
/ 08 мая 2009
$matches = array();
preg_match_all( "/\[PT#([^\];]+);([^\]]+)\]/", $input, $matches,  PREG_SET_ORDER);

foreach ($matches as $match) {
  echo "id=", trim($match[1]), " brand=", trim($match[2]), "\n";
}
0 голосов
/ 08 мая 2009

Полагаю, вы будете читать из текстового файла, содержащего много этих записей. Что вы можете сделать, это:

preg_match_all("/\[PT#(.*?);[.*]?(.*?)\]/i", $text, $result);

он поместит все совпадения в массив $ result, и вы сможете получить к ним доступ следующим образом:

echo $result[1][0]; //echos first occurrence's serial

$ result - это отсортированный мажорный столбец, а первая запись в совпадении - это строка полного совпадения

echo $result[0][0]; // would print [PT# 123456ABC; Sony]
echo $result[1][0]; // would print 123456ABC
echo $result[2][0]; // would print Sony

Надеюсь, что поможет

EDIT: исправлено регулярное выражение, теперь должно работать (пока не проверено)

0 голосов
/ 08 мая 2009

Я думаю, что это сделало бы

preg_match_all( "/(\[PT#\s+.*?;\s+.*?\])/", $input, $matches );

print_r( $matches );

В качестве альтернативы, если вы просто хотите получить уникальную информацию

preg_match_all( "/\[PT#\s+(.*?);\s+(.*?)\]/", $input, $matches );
...