Mam następujące wyrażenie regularne w JavaScript i chciałbym mieć dokładną funkcjonalność (lub podobną) w PHP:

// -=> REGEXP - match "x bed" , "x or y bed":
var subject = query;
var myregexp1 = /(\d+) bed|(\d+) or (\d+) bed/img;
var match = myregexp1.exec(subject);
while (match != null){
    if (match[1]) {   "X => " + match[1]; }
    else{             "X => " + match[2] + " AND Y => "  + match[3]}
    match = myregexp1.exec(subject);
}

Kod ten przeszukuje ciąg znaków dopasowywania wzoru "X łóżka" lub "X lub Y Łóżka". Po umieszczeniu meczu zmienna X i zmienna Y są wymagane do dalszego przetwarzania.

PYTANIE:

Jak skonstruować ten fragment kodu w PHP?

Każda pomoc doceniła faceci ...

1
Donal.Lynch.Msc 2 październik 2011, 21:43

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć regexa niezmienionego. Składnia PCRE obsługuje wszystko, co robi JavaScript. Z wyjątkiem flagi /g, która nie jest używana w PHP. Zamiast tego masz preg_match_all, który zwraca tablicę wyników:

preg_match_all('/(\d+) bed|(\d+) or (\d+) bed/im', $subject, $matches, 
    PREG_SET_ORDER);
foreach ($matches as $match) {

PREG_SET_ORDER jest tutaj inną sztuczką i utrzyma tablicę $match podobną do tego, jak dostaniesz go w JavaScript.

1
mario 2 październik 2011, 17:49

Znalazłem Rosettacode, aby być przydatnym podczas odpowiadania na te pytania.

Pokazuje, jak zrobić to samo w różnych językach. Regex to tylko jeden przykład; Mają też plik IO, sortowanie, wszelkiego rodzaju podstawowe rzeczy.

1
Cheeso 2 październik 2011, 17:52

Możesz użyć preg_match_all( $pattern, $subject, &$matches, $flags, $offset ), aby uruchomić regularny Wyrażenie nad łańcuchem, a następnie przechowywać wszystkie mecze do tablicy.

Po uruchomieniu REGEXP wszystkie mecze można znaleźć w tablicy, którą przekazałeś jako trzeci argument. Następnie możesz iterować te mecze za pomocą foreach.

Bez ustawiania $flags Twoja tablica będzie miała taką strukturę:

$array[0] => array ( // An array of all strings that matched (e.g. "5 beds" or "8 or 9 beds" )
    0 => "5 beds",
    1 => "8 or 9 beds"
);
$array[1] => array ( // An array containing all the values between brackets (e.g. "8", or "9" )
    0 => "5",
    1 => "8",
    2 => "9"
 );

To zachowanie nie jest dokładnie takie same, a ja osobiście tego nie lubię. Aby zmienić zachowanie do bardziej "javascript" - set $flags do PREG_SET_ORDER. Twoja tablica będzie miała taką samą strukturę jak w JavaScript.

$array[0] => array(
    0 => "5 beds", // the full match
    1 => "5", // the first value between brackets
);
$array[1] => array(
    0 => "8 or 9 beds",
    1 => "8",
    2 => "9"
);
0
anroesti 2 październik 2011, 18:00