| Autor | Zpráva | ||
|---|---|---|---|
| hejdav Profil * |
#1 · Zasláno: 25. 6. 2014, 16:14:05
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 |
#2 · Zasláno: 25. 6. 2014, 16:55:23
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 |
#3 · Zasláno: 25. 6. 2014, 18:36:07
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 * |
#4 · Zasláno: 25. 6. 2014, 20:46:08 · Upravil/a: hejdav
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 * |
#5 · Zasláno: 26. 6. 2014, 08:45:28
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 |
||
|
Časová prodleva: 12 let
|
|||
0