2017-05-19 4 views
3

Regex die falschen Wörter wie Hell«o» wird markiert und ignoriert die richtigen Worte «Hello» oder Hello, Also, mein Problem für meine Javascript-Code funktioniert prima, aber wenn ich es für PHP versuchen, es auch die Zeichenfolge Hervorhebungen, was sollte nicht:php preg_match_all funktioniert nicht

  1. '«Dies ist der Point of Sale»;

hier ist mein regex: https://regex101.com/r/SqCR1y/14

PHP-Code:

$re = '/^(?:.*[[{(«][^\]})»\n]*|[^[{(«\n]*[\]})»].*|.*\w[[{(«].*|.*[\]})»]\w.*)$/m'; 
$str = '«This is the point of sale»'; 

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 

// Print the entire match result 
var_dump($matches); 

// Ausgabe

array(1) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(29) "«This is the point of sale»" 
    } 
} 

erwartet: leeres Array

jsfiddle hier, welche arbeitet gut

Vielen Dank im Voraus

Antwort

1

Sie verwenden nicht das richtige Muster. versuchen Sie dies:

$re = '/^ 
    (?: 
    \([^)\n] | [^(\n]*\). | 
    \[[^]\n] | [^[\n]*\]. | 
    {[^}\n] | [^{\n]}.* | 
    «[^»\n] | [^«\n]*». | 
    .?\w[[{(«]. | .?[\]})»]\w. 
) 
$/mxu'; 
0

Was ist mit einer Zeichenfolge wie "(nicht) ausgeglichen)"? Sollte das legal sein?

Diese Art von Muster nicht explizit in Ihrem Test eingegeben wird, aber da keiner Ihrer „gut“ Strings sind unausgeglichen, können Sie diese Fälle abdecken könnte in Erwägung ziehen regex recursion mittels ausgewogener Klammerausdrücke passen und gültig Strings Targeting statt ungültiger diejenigen:

$re = '/ 
    ^
    (?!.*\w[{}«»\(\)\[\]]\w) //disallow brackets inside words 
    (?: 
    [^\n{}«»\(\)\[\]]|  //non bracket character, OR: 
    (      //(capture group #1, the recursive subpattern) "one of the following balanced groups": 
    (\((?:(?>[^\n«»\(\){}\[\]]|(?1))*)\))| //balanced paren groups 
    (\[(?:(?>[^\n«»\(\){}\[\]]|(?1))*)\])| //balanced bracket groups 
    («(?:(?>[^\n«»\(\){}\[\]]|(?1))*)»)|  //balanced chevron groups 
    ({(?:(?>[^\n«»\(\){}\[\]]|(?1))*)})  //balanced curly bracket groups 
    ) 
    )+ //repeat "non bracket character or balanced group" until end of string 
    $ 
/mxu'; 

die Rekursion nimmt diese Form:

[openbracket]([nonbracket] | [open/close pattern again via recursion])*[closebracket] 

Um einen Teil des Musters verwenden rekursiv Sie es über die Capture-Gruppe identifizieren, umschließt es (?N), wobei N die Nummer der Gruppe ist.

* Die anfängliche negative Vorschau wird keine „Wortgrenze“ Verletzungen scheitern, bevor sie in die rekursive Sachen gehen

* Diese Regex etwa 35% schneller als der ursprüngliche Ansatz sein sieht, wie hier zu sehen: https://regex101.com/r/MBITHe/4