2016-04-29 15 views
3

Ich muss fett um eine Telefonnummer innerhalb einer Zeichenfolge umschließen. Ich habe die folgende Regexregulärer Ausdruck, um Telefonnummern fett zu machen - funktioniert nicht immer

/(\d[\d\s]*)(?=\s+)/ 

, die für das funktioniert:

Rufen Sie uns unter 0800 2458 452 jetzt! diese

aber nicht: So

Rufen Sie uns jetzt auf 0800 2458 452

wenn die Zahl am Ende der Zeichenfolge tritt der Regex nicht richtig funktioniert. Es gibt die Zeichenfolge aus, bei der das Fett der letzten drei Ziffern fehlt.

Call us now on <b>0800 2458</b> 452 

Kann jemand sehen, was mit dem Code falsch ist?

$bold_text = preg_replace('/(\d[\d\s]*)(?=\s+)/', '<b>$1</b>', $text); 

Antwort

2

Verwendung Wortgrenze statt Raum

(\d[\d\s]*)(?=\b) 

und besser gleich hinzufügen, bevor

(?<=\b)(\d[\d\s]*)(?=\b) 

passen nicht B52

+0

Wirklich, '(? = \ B)' ist eine Tautologie. Warum sollte eine nullbreite Assestion innerhalb einer Assertion mit der Breite null verwendet werden? '(? = \ b)' = '\ b',' (? <= \ b) '=' \ b' –

+0

ja. Du hast recht. Ich habe gerade mit Leerzeichen angefangen und habe die Logik nicht geändert :) – splash58

+0

Beachten Sie, dass [Ihr Regex wird auch Float-Werte entsprechen] (https://regex101.com/r/rW7kG1/1), während meine letzte vorgeschlagene Regex sie vermeiden wird. –

1

Ihr Look-Ahead-Muster erfordert mindestens 1 Leerzeichen nach der Telefonnummer. Sie können "abrollen" Ihr Muster an den Wortgrenzen entsprechen:

\b\d+(?:\s+\d+)*\b 

den See regex demo

Oder nutzen Sie die eindeutige Wortgrenzen - (?<!\w) und (?!\w):

(?<!\w)\d+(?:\s+\d+)*(?!\w) 

Das Muster Treffer:

  • (?<!\w) - kein Wortzeichen vor der Ziffer
  • \d+ - 1+ digits
  • (?:\s+\d+)* - null oder mehr Folgen von Leerzeichen gefolgt 1+ 1+ mit Ziffern
  • (?!\w) - nicht mit einem Wort (Alpha-/Unterstrich), gefolgt Charakter.

Siehe this regex demo

IDEONE PHP demo:

$re = '~(?<!\S)\d+(?:\s+\d+)*(?!\S)~'; 
$strs = array("Call us on 0800 2458 452 now!","Call us now on 0800 2458 452"); 
foreach ($strs as $str) { 
echo preg_replace($re, '<b>$0</b>', $str) . PHP_EOL; 
} 

GOTCHA: Gleitkommazahlen

Wenn Sie sicherstellen möchten, dass Sie nicht schwimmt mit dem regulären Ausdruck entsprechen, verwenden

(?<!\w|\d\.)\d+(?:\s+\d+)*(?!\w|\.\d) 

Siehe die regex demo

Verwandte Themen