2012-11-10 48 views
1

在我正在處理的網站中,我使用this question中的答案將字符串轉換爲slu gs。它的工作原理,但我發現有巨大的內存泄漏問題。我做了一些研究,發現這只是PHP中的一個bug。PHP preg_replace() - 內存問題。另類?

是否有任何替代方案來完成類似字符串slu something的東西?

編輯:

還有一個有趣的角度來解決這個問題。我正在重新開發使用regex(呃,我知道)製作的刮板,所以我決定使用DOMDocument/XPath作爲解決方案。

有趣的是,原來的regex scrape也使用了上面的slugify()函數,並且沒有內存問題。但是,一旦我設置了DOMDocument刮擦,刮擦中途崩潰,錯誤始終在slugify()函數的preg_replace()行上面。

因此,儘管這兩種情況下使用完全相同的slugify()函數,僅在preg_replace()

回答

2

的preg_replace DOM文檔版本崩潰是這個不錯,但更好的方法是砍出來使用http://php.net/manual/en/function.str-replace.php

+0

沒錯。任何指向使用這個的slugify()函數的指針? – djt

+0

大聲笑我正在嘗試,但preg_replace是完美的... –

+0

哈耶我知道...但我正在做一個刮(不使用preg_replace!使用DOM文檔),但是當某個文本進來時,我在進入數據庫之前必須把它變成一個slu g。所以我最終得到了preg_replace()的這些循環,顯然這只是每次對內存使用進行復合 – djt

1

通過取消設置變量,您應該可以釋放一些內存。是的,它是骯髒的,但可能工作

static public function slugify($text) {  
    // replace non letter or digits by - 
    $text2 = preg_replace('~[^\\pL\d]+~u', '-', $text); 

    // unset $text to free up space 
    unset($text); 
    // trim 
    $text2 = trim($text2, '-'); 

    // transliterate 
    $text2 = iconv('utf-8', 'us-ascii//TRANSLIT', $text2); 

    // lowercase 
    $text2 = strtolower($text2); 

    // remove unwanted characters 
    $text = preg_replace('~[^-\w]+~', '', $text2); 

    // unset $text2 to free up space 
    unset($text2); 

    if (empty($text)) { 
    return 'n-a'; 
    } 
    return $text; 
} 

https://bugs.php.net/bug.php?id=35258&edit=1

http://www.php.net/manual/en/function.preg-replace.php#84285

希望你找到一個清晰的解決方案。

+0

不幸的是,這似乎沒有幫助 – djt