2017-10-09 15 views
0

Ich möchte alle Räume mit   ersetzen, die nur von Fig. space digit/s and dot gefolgt werden. Zum Beispiel, wenn die Zeichenfolge ist Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds ich es ersetzt werden soll..PHP-Regex, um nur Platz zu finden, gefolgt von Ziffern und Punkt

Abb   1.   sasasa Abb   34.   345 dffdfd usw. dsds.

Gibt es eine Möglichkeit, es mit Regex zu tun? Ich habe versucht, die Regex /(Fig\.\s)(\d+)(\\.)(\s+)/, aber es entspricht Fig. gefolgt von Leerzeichen gefolgt von Ziffer/s gefolgt von Punkt und Leerzeichen, aber ich will nur jene Räume, die das Muster vorausgehen. Schätzen Sie Ihre Hilfe/Hinweis diesbezüglich. Vielen Dank.

PS: Der Grund, warum ich das machen will, ist, dass ich versuche, Sätze zu trennen, die mit Punkt und Leerzeichen enden. Aber in einigen Sätzen gibt es einige Wörter und Zahlen gefolgt von Punkt und Leerzeichen (wie Fig. 1. oder Mr. etc), also möchte ich diese Punkte und Leerzeichen zu   ersetzen, damit die Sätze richtig aufgeteilt werden.

+0

Könnten Sie bitte ein weiteres Beispiel geben? Und posten Sie den relevanten Code, den Sie verwenden. –

+0

Warum keine Übereinstimmung '345 dffdfd'? Ansonsten ist es einfach _Find_ '(?: (?! \ A) \ G | (Bild)) ([\ d.] *) []', _Replace_ '$ 1 $ 2  ' – sln

Antwort

1

Dies ist eine schwierige regex ist das Richtige zu tun.

Dies entspricht Ihrer Betreff-Zeichenfolge, wenn Sie ihr zugeordnet haben.

Weltweit finden: (?:(?!\A)\G|(Fig))([\d.]*)(?<=[ .])[ ]
ersetzen: $1$2&nbsp;

https://regex101.com/r/91hgVD/3

Kommentare

(?: 
     (?! \A)    # Not Begin of String 
     \G     # \G anchor, start where last left off 
    |      # or 
          # Reset's \G 
     (Fig)    # (1), Fig 
) 
([\d.]*)   # (2), Optional digits or dots 
(?<= [ .])   # Must be a dot or space behind 
[ ]     # space 

Hinweis - es ist ein wenig Magie los zwischen ([\d.]*) und (?<=[ .])

Das optionale [\ d.] Verbraucht Ziffern und Punkte,
aber die (? < = [.]) Erfordert einen Punkt vor dem Leerzeichen ODER ein anderes Leerzeichen.
Aber wird zum Beispiel Fig <space> nicht übereinstimmen.

+0

Dieser hat auch funktioniert. Aus Gründen der Einfachheit akzeptiere ich die obige Antwort, aber ich schätze Ihre Antwort für die Erklärungen sehr. Ich habe Upvoted, aber wird nur gezeigt, nachdem ich 15 plus Rep-Score bekommen habe. Danke, Sln. –

+0

Dies funktionierte perfekt für alle Fälle nicht nur Fig., Sondern auch Herr St. und was auch immer Wörter, die ich nicht von Punkt verfolgt werden möchte Ich habe Ihre Regex mehrmals für jedes Wort verwendet (ex Abb. Mr. St. etc). Dieser Regex hat mein Problem perfekt gelöst!Ich akzeptiere diese Antwort jetzt. Danke für Ihre Hilfe. –

+0

@KrishnaBasada - Ja, du könntest sie zu einem Wechsel kombinieren. Anstelle von 'Fig' könntest du so viele hinzufügen wie du willst' (?: Fig | St | Ms | Mrs | Mr) 'etc .. – sln

0

Versuchen Sie, die Regex und preg_replace_callback() Funktion aus diesem Beispiel:

$str ='Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds'; 
$str = preg_replace_callback('/(Fig\.)[ ]([0-9]+[\.]{1})[ ]*/i', function($m){ 
    return str_ireplace(' ', '&nbsp;', $m[0]); 
}, $str); 

echo $str; // Fig.&nbsp;1.&nbsp;sasasa Fig.&nbsp;34.&nbsp;345 dffdfd etc. dsds 

Oder, von hier:

$str ='Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds'; 
$str = preg_replace_callback('/(Fig\.)[ ]([0-9]+[\.]{1})[ ]*/i', function($m){ 
    return str_ireplace([$m[1].' ', $m[2]], [$m[1].'&nbsp;', $m[2].'&nbsp;'], $m[0]); 
}, $str); 

echo $str; // Fig.&nbsp;1.&nbsp; sasasa Fig.&nbsp;34.&nbsp; 345 dffdfd etc. dsds 
+0

Ausgezeichnet! Ich kann nicht glauben, dass ich die Antwort so schnell bekommen habe! Vielen Dank für ein paar CoursesWeb. Ich bin nicht so gut darin, Regex zu benutzen, aber ich bin so froh, dass du mir geholfen hast und du hast meinen Tag gerettet. Danke noch einmal! –

Verwandte Themen