2017-08-17 38 views
0

後恢復回來的字符串格式,我需要的句子或段落提取到每個單詞和操縱字成另一種形式。例如,我需要更改單詞'麪條''##麪條##'。我正在使用此代碼將句子分解爲文字,並使用implode()函數進行合併。如何操作

function display_sentence_with_answer($str="") 
{ 
    $arr_output = []; 
    $str = preg_replace("#<p>(\s| |</?\s?br\s?/)*</?p>#","",$str); 
    $words = preg_replace('#<[^>]+>#', ' ', $str); 
    $arr_words = preg_split('/<[^>]+>(?:\s+<[^>]+>)*|\s+/u', trim($words)); 

    foreach($arr_words as $word) 
    { 
     $arr_output[] = '##'.$word.'##'; 
    } 
    $output_str = implode(" ",$arr_output); 
    return $output_str; 
} 

輸入:

Nyatakan pecahan bagi rajah di bawah. 

<br/> 
4/5 


<p> 
p</p> 

但是,我得到的輸出:

##Nyatakan## ##pecahan## ##bagi## ##rajah## ##di## ##bawah.## ##4/5## ##p## 

如何恢復回我目前的輸入格式?任何人都會遇到這種需求?

我的預期輸出是:

##Nyatakan## ##pecahan## ##bagi## ##rajah## ##di## ##bawah.## 

<br/> 
##4/5## 


<p> 
p</p> 

謝謝!

+1

你可以有兩個元素返回數組。 – user1915746

+0

@ user1915746不會真的幫助,因爲他還需要識別字符串在他們< or />。他可能也會對原始數組中的數據進行檢查 – IsThisJavascript

回答

1

您可以使用此正則表達式與PCRE動詞(*SKIP)(*F)跳過某些賽事:

(?:<([^>]*)>.*?</\1>|<[^>]*/>)(*SKIP)(*F)|\b\w\S* 

RegEx Demo

正則表達式破碎:

(?:     # start non capturing group 
    <([^>]*)>.*?</\1> # match a tag and closing tag <tag>...</tag> 
    |     # OR 
    <[^>]*/>   # match a tag like <tag/> 
)      # end non capturing group 
(*SKIP)(*F)   # skip this match 
|      # OR 
\b\w\S*    # match a word starting with a word character 

注意: HTML是不是常規的語言,它可能是非常不可預測的d建議不要用正則表達式解析HTML。原始字符串和處理字符串:

+0

如何在PHP中使用?我試過但沒有成功。能給我看看麼? ;) – Nere

+0

你能推薦給我,什麼是練習REGEX的最佳網頁? – Nere

+0

這應該在php中工作。在我提供的演示鏈接中,您可以看到相同正則表達式的php代碼。 – anubhava