Autor Zpráva
hejdav
Profil *
Když si spustíte následující kód:

<?php
$regexp = '/^there is(?: (monkey) in the)? (tree)$/';
preg_match($regexp, 'there is tree', $matches);

$matches obsahuje
Array (
  [0] => there is tree
  [1] =>
  [2] => tree
)

pokud ovšem regulár trochu upravím (nezachytávám "tree" na konci):

<?php
$regexp = '/^there is(?: (monkey) in the)? tree$/';
preg_match($regexp, 'there is tree', $matches);

$matches náhle obsahuje JEN:

Array (
  [0] => there is tree
)

Očekával bych, že bude obsahovat i index 1 s prázdným řetězcem.

Mám PHP 5.5.11. Myslíte si, taky jako já, že je to bug?

Vláďa
Fisir
Profil
Reaguji na hejdava:
Myslíte si, taky jako já, že je to bug?
Ne.

index 1 s prázdným řetězcem
A to by mělo odpovídat jaké části reguláru? ?: značí, že se nemá tvořit zpětná reference.
Tori
Profil
Logika věci nejspíš bude v tom, že v prvním případě je potřeba očíslovat výraz č.1 (monkey), protože za ním jde č.2 (tree). Sice ten první výraz se nezachytává, ale pořadí mít musí. Když ho upravíte na (?:monkey), tak se nezachytává ergo nečísluje a ve výsledku nebude. V druhém případě pak máte (?: (monkey) in the)? a za ním žádný další subpattern - takže to (monkey) uvnitř ani není potřeba číslovat, ergo ve výsledku index 1 není. Asi.
hejdav
Profil *
myslím si, že by každá zachytávaná závorka měl být ve výsledku, ať už něco obsahuje nebo ne..


a navíc, neni ?: pouze non-capturing group, která s backreferencí nemá nic společnýho?
hejdav
Profil *
tak jsem se mejlil, vůbec tam nemusej bejt vnořený závorky

$regexp = '/foo( bar)?/';
preg_match($regexp, 'foo', $matches);
echo $matches[1]; // expected '', actual NOTICE

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: