Используйте preg_match (), чтобы найти начальную / конечную позиции подстроки, соответствующей шаблону - PullRequest
4 голосов
/ 16 июня 2010

Я хочу скопировать подстроку строки, используя PHP.

Регулярное выражение для первого шаблона: /\d\|\d\w0:/

Регулярное выражение для второго шаблона: /\d\w\w\d+:\s-\s:/

Возможно ли объединить preg_match с strpos, чтобы получить точные позиции от начала до конца, а затем скопировать его с:

substr( $string, $firstPos,$secPos ) ?

Ответы [ 4 ]

4 голосов
/ 16 июня 2010

Я не уверен, но, возможно, вы могли бы использовать preg_split для этого, как это:

$mysubtext = preg_split("/\d\|\d\w0:/", $mytext);

$mysubtext = preg_split("/\d\w\w\d+:\s-\s:/", $mysubtext[1]);

$mysubtext = $mysubtext[0];
3 голосов
/ 16 июня 2010

При использовании четвертого параметра preg_match() вы даже можете установить флаг PREG_OFFSET_CAPTURE, чтобы функция возвращала смещение совпадающей строки.Поэтому не нужно объединять preg_match() и strpos().

http://php.net/manual/function.preg-match.php

3 голосов
/ 16 июня 2010

Конечно.

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

$prefix = '\d|\d\w0:';
$suffix = '\d\w\w\d+:\s-\s:';
if (preg_match("/(?<=$prefix).*?(?=$suffix)/", $subject, $match)) {
    $substring = $match[0];
}

(Помимо: вы, вероятно, захотите использовать модификатор s или что-то отличное от ., если ваша подстрока будет занимать несколько строк.)

0 голосов
/ 16 июня 2010

Третий аргумент preg_match - это выходной параметр, который собирает ваши захваты, то есть фактические строки, которые совпадают.Используйте их, чтобы накормить свои strpos.Strpos не будет принимать регулярные выражения, но записи будут содержать фактический сопоставленный текст, который содержится в вашей строке.Чтобы сделать снимки, используйте круглые скобки.

Например (не пробовал, но это идея):

$str = 'aaabbbaaa';
preg_match('/(b+)/', $str, $regs );
// now, $regs[0] holds the entire string, while $regs[1] holds the first group, i.e. 'bbb'
// now feed $regs[1] to strpos, to find its position
...