Извлечение соответствий от php regex

Вот основная идея насколько я понимаю. Скажите, что Вы прибыли в звездообразную систему № 42, и необходимо узнать то, что находится в нем. Это имеет nplanets планеты - число между 0 и 10, скажите:

>>> star_system = 42
>>> nplanets = hash('nplanets%d' % star_system) % (10 + 1)
>>> nplanets
4

хорошо, таким образом, планетой № 2, сколько космических станций находится в орбите там в начале игры? Найдите число между 0 и 3:

>>> planet = 2
>>> nstations = hash('nstations%d/%d' % (star_system, planet)) % (3 + 1)
>>> nstations
1

И так далее. Числа - каждый хеш-функция индексов (звездообразная система № 42, планета № 2, в этом случае), уменьшенный до соответствующего диапазона. Так как хеш-функции детерминированы, но 'случайны', это - тот же каждый раз, но случайно смотрящий плеер.

, Конечно, хешируя строки с длинными последовательностями как 'nstations' в них не самый быстрый способ пойти об этом, но это показывает идею.

15
задан Natkeeran 29 September 2009 в 18:44
поделиться

4 ответа

Попробуйте использовать синтаксис именованного подшаблона preg_match:

<?php

$str = 'foobar: 2008';

// Works in PHP 5.2.2 and later.
preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

// Before PHP 5.2.2, use this:
// preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

print_r($matches);

?>

Вывод:

 Array (
     [0] => foobar: 2008
     [name] => foobar
     [1] => foobar
     [digit] => 2008
     [2] => 2008 )
26
ответ дан 1 December 2019 в 00:59
поделиться

См. Руководство по php

int preg_match (string $ pattern, string $ subject [, array & $ matches [, int $ flags [, int $ offset]]])

Если указаны совпадения, то они заполняются результатами поиска. $ match [0] будет содержать текст, соответствует полному шаблону, $ соответствует 1 будет иметь текст, соответствующий первый захваченный в скобках подшаблон и т. д.

$subject = "E:contact@customer.com I:100955";
$pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/";
if (preg_match($pattern, $subject,$matches)) {
    print_r($matches);
}
9
ответ дан 1 December 2019 в 00:59
поделиться

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

$subject = "E:contact@customer.com I:100955";
$pattern = "/^E:([^ ]+)/";
if (preg_match($pattern, $subject, $m)) {
    echo "Yes, A Match";
}
$email = $m[1];

Если вы не знакомы с регулярным выражением, [^] + означает «любой символ, кроме пробела» , и для работы не требуется наличие пробела. Если по какой-либо причине ввод изменится на «E: email@host.tld » без бита «I: 12345» , он все равно будет работать.

3
ответ дан 1 December 2019 в 00:59
поделиться

Используйте параметр matchs функции preg_match следующим образом:

соответствует:
Если есть совпадения, то оно заполняется результатами поиска. $ Match [0] будет содержать текст, соответствующий полному шаблону, $ match [1] будет иметь текст, который соответствует первому захваченному вложенному шаблону в скобках, и так далее.

2
ответ дан 1 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: