2010-04-28 77 views
0

我需要長字符串分割成一個陣列,以下約束:字符串分割到較小部分與約束[PHP正則表達式HTML]

  • 輸入將是HTML字符串,可以是整頁或部分的。
  • 每個部分(新的字符串)將有性格(如爲不超過8000字)
  • 有限數量的每個部分可以包含多個句子(由分隔。[句號])但從來沒有一個部分句子除非字符串的最後一部分(如最後部分可能沒有任何句號。
  • 字符串包含HTML標籤,但標籤不能被劃分爲(<a href='test.html'><a href='test。和html'>)。這意味着HTML標籤應該是完整的但是開始標籤和結束標籤可以留在不同的分段/塊
  • 如果任何中間句子大於所需的長度,那麼應該在前面和後面的標籤和空格數組的不同部分,即使這樣做後,如果句子更長,然後將它分成數組的多個元素:(
  • 請注意:無需解析HTML,但標籤(如或等)< *>

我覺得有使preg_split正則表達式可以做到這一點。請用適當的RegEx幫助我。除正則表達式以外的任何解決方案也是受歡迎

謝謝

薩迪

回答

1

糾正我,如果我錯了,但我不認爲你可以用一個簡單的正則表達式做到這一點。在一個完整的正則表達式的實現,你可以使用這樣的事情:

$parts = preg_split("/(?<!<[^>]*)\./", $input); 

但是PHP不允許非固定長度的回顧後,這樣就不會工作。顯然只有2個是jgsoft和.net正則表達式。 Useful Page

我這個處理將是方法:

function splitStringUp($input, $maxlen) { 
    $parts = explode(".", $input); 
    $i = 0; 
    while ($i < count($parts)) { 
     if (preg_match("/<[^>]*$/", $parts[$i])) { 
      array_splice($parts, $i, 2, $parts[$i] . "." . $parts[$i+1]); 
     } else { 
      if ($i < (count($parts) - 1) && strlen($parts[$i] . "." . $parts[$i+1]) < $maxlen) { 
       array_splice($parts, $i, 2, $parts[$i] . "." . $parts[$i+1]); 
      } else { 
       $i++; 
      } 
     } 
    } 
    return $parts; 
} 

你沒有提到你想要什麼發生,當一個人一句話就是> 8000個字符長,所以這只是使他們完好。

輸出樣本:

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 8000); 
array(1) { 
    [0]=> string(114) "this is a sentence. this is another sentence. this is an html <a href="a.b.c">tag. and the closing tag</a>. hooray" 
} 

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 80); 
array(2) { 
    [0]=> string(81) "this is a sentence. this is another sentence. this is an html <a href="a.b.c">tag" 
    [1]=> string(32) " and the closing tag</a>. hooray" 
} 

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 40); 
array(4) { 
    [0]=> string(18) "this is a sentence" 
    [1]=> string(25) " this is another sentence" 
    [2]=> string(36) " this is an html <a href="a.b.c">tag" 
    [3]=> string(32) " and the closing tag</a>. hooray" 
} 

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 0); 
array(5) { 
    [0]=> string(18) "this is a sentence" 
    [1]=> string(25) " this is another sentence" 
    [2]=> string(36) " this is an html <a href="a.b.c">tag" 
    [3]=> string(24) " and the closing tag</a>" 
    [4]=> string(7) " hooray" 
} 
+0

對不起!我忘記提及這一點。我將更新這一點。 – Sadi 2010-04-30 19:29:58

+0

它看起來像你的解決方案放棄fullstops:P這將不會是問題添加完整站(我認爲):) – Sadi 2010-04-30 19:46:41

+0

是啊,只是添加一個。到每個部分的末尾:) – oedo 2010-05-01 07:53:37

0

不幸的是,HTML是不規則的語言,意味着你不能用一個正則表達式解析它。另一方面,如果輸入總是相似的,或者只需要解析某些部分,那就沒有問題。迭代過此正則表達式生成的元素的名稱和它的內容:

'~<(?P<element>\s+)(?P<attributes>[^>]*)>(?:(?P<content>.*?)</\s+>)?~' 
+0

其實我不關心HTML。我關心標籤。標籤以'<開始並以'>'結尾。這就夠了。除了正則表達式以外的任何解決方案都可以。我會嘗試你的答案。謝謝你的時間:) – Sadi 2010-04-29 02:12:55

+0

哦!不要忘記每個新字符串的長度。這是最重要的部分 – Sadi 2010-04-29 02:13:48

相關問題