preg_math умножить ответ - PullRequest
       16

preg_math умножить ответ

0 голосов
/ 17 августа 2011
<?php
$string = "Movies and Stars I., 32. part";
$pattern = "((IX|IV|V?I{0,3}[\.]))";

if(preg_match($pattern, $string, $x) == false)
{
    print "NAPAKA!";
}
else
{
    print_r($x);
}
?>

И ответ:

Array ( [0] => I. [1] => I. )

Я должен получить только 1 ответ ... Почему я получаю несколько ответов?

Ответы [ 4 ]

1 голос
/ 17 августа 2011

В вашем паттерне несколько групп -> скобки () сообщают вам, что захватывать в вашем матче.

Попробуйте это:

$pattern = "(IX|IV|V?I{0,3}[\.])";

Если вам трудно определить нужные группы в результате, вы можете назвать их, как указано в документации php.net .

Это будет выглядеть примерно так:

$pattern = "(?P<groupname>IX|IV|V?I{0,3}[\.])";
1 голос
/ 17 августа 2011

Элементом с индексом 0 является вся совпадающая строка. Элемент с индексом 1 является содержимым первой группы захвата, то есть содержимым внутри круглых скобок. В этом случае они просто оказываются одинаковыми. Просто используйте $x[0], чтобы получить искомое значение.

1 голос
/ 17 августа 2011

Вложенные скобки должны, в этом случае, быть «не захватывающим» подшаблоном.

$pattern = "~((?:IX|IV|V?I{0,3}[\.]))~";

Попробуй это. Он скажет компилятору regex, чтобы он не фиксировал результаты этих скобок в массиве.

На самом деле, глядя на ваше регулярное выражение, вам даже не нужны эти скобки. Сделайте свое регулярное выражение так:

$pattern = "~IX|IV|V?I{0,3}[\.]~";

Это тоже должно сработать.

0 голосов
/ 17 августа 2011

Вы получаете 0-индексированный для всей математической строки и результат для каждой паретности ().полезно получить группы, например

preg_match('~([0-9]+)([a-z]+)','12abc',$x);
$x is ([0]=>12abc [1]=>12 [2]=>abc)

. В вашем случае вы можете просто удалить () (1 пара из них, 1 пара используется в качестве разделителей)

...