簡體   English   中英

使用正則表達式替換文本,同時去除換行符和引號

[英]Use regex to replace text while stripping newlines and quotes

現在這大部分都是學術性的,因為我可以通過其他方式獲得相同的結果,但是……這一直困擾着我,我相信使用正則表達式是有可能的。

我想使用PHP的preg_replace替換內容,因此:

Content: “String <tag>This is some content, which contains newlines and quotation marks.</tag> and other unrelated content”.

Regex: /<tag>(.*)<\/tag>/sU

Replace: “String of other content, including matched pattern $1”

但是問題是,我想刪除元素之間找到的所有換行符和/或引號。 什么正則表達式將允許我執行此操作?

PHP的preg_replace()對主題進行一次處理。 實際上,您可以指定一組模式和替換項,但是在主題字符串的每個部分上都只能匹配一個。 使用singel正則表達式肯定沒有解決方案,因為此問題不在常規語言中。 理論計算機科學教導您需要有狀態的自動機才能執行此類任務。 正則表達式是原始的。

正如arkascha指出的那樣,這並不是一個可以輕松解決的問題。

可以在Perl中一步完成:

use strict;
use warnings;
my $string = "blah <tag> foo \"bar \n </tag> baz";

$string =~ s/(?<=\<tag\>)([^<]+)(?=\<\/tag\>)/$_=$1;s|[\n\"]||gs;$_/ges;

print $string;

這利用了Perl允許您使用代碼來生成替換字符串的事實。

我不知道是否可以在PHP中完成類似的操作。 無論如何,這不是一個好的現實世界代碼設計。 但這很有趣。

不容易,但是可能。

試試這個PHP代碼

function myFn($a, $b, $c) {
  $b = preg_replace("!(?:\\\'|[\"\n\r])!", '', $b);
  return "BEGIN " . $b . " END";
}
$s = "abc <tag>def \n ghi 'jkl' mno \"pqr\" stu</tag> vwx";
$s = preg_replace('!(<tag>)(.*?)(</tag>)!ise', 'myFn("$1", "$2", "$3")', $s);
print $s;

輸出:

abc BEGIN def  ghi jkl mno pqr stu END vwx

在此處測試此代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM