2010-11-11 19 views
5

गलती जब मैं निम्नलिखित कोड निष्पादित फेंकता है; मुझे हर बार एक सीजी गलती मिलती है! क्या यह कोई ज्ञात त्रुटि है? मैं यह कोड कैसे काम कर सकता हूं?preg_replace SEG

<?php 
$doc = file_get_contents("http://prairieprogressive.com/"); 
$replace = array(
    "/<script([\s\S])*?<\/ ?script>/", 
    "/<style([\s\S])*?<\/ ?style>/", 
    "/<!--([\s\S])*?-->/", 
    "/\r\n/" 
); 
$doc = preg_replace($replace,"",$doc); 
echo $doc; 
?> 
त्रुटि

(जाहिर है) लगता है कि:

[[email protected] 2.0]# php test.php 
Segmentation fault (core dumped) 
+1

क्या तुमने कभी एक [उचित HTML पार्सर] का उपयोग कर के बारे में सोचा है (http://stackoverflow.com/questions/3650125/how-to-parse-html-with-php-closed)? – Gumbo

+0

बस एक नोट के रूप में मुझे लगता है कि आप स्क्रिप्ट और स्टाइल टैग के बाद '>' गायब हैं। – GWW

+0

हमें वास्तविक त्रुटि दिखाएं। अगर आपको segfault मिल रहा है तो यह आपके PHP इंस्टॉलेशन के साथ एक समस्या है। या एक बग। किसी भी तरह से, @ गम्बो की सलाह का पालन करें और एक HTML पार्सर का उपयोग करें। – Cfreak

उत्तर

2

आप अनावश्यक कैप्चर समूहों कि PCRE की बैक ट्रैकिंग तनाव है। इस प्रयास करें:

$replace = array(
    "/<script.*?><\/\s?script>/s", 
    "/<style.*?><\/\s?style>/s", 
    "/<!--.*?-->/s", 
    "/\r\n/s" 
); 

एक और बात, \s (सफेद स्थान) \S (गैर-सफ़ेद) के साथ संयुक्त कुछ भी मेल खाता है। तो बस . पैटर्न का उपयोग करें।

1

ठीक है! जब मैं

$doc = preg_replace("/<style([\s\S]*)<\/ ?style>/",'',$doc); 

$doc = preg_replace("/<style([\s\S])*<\/ ?style>/",'',$doc); 

यह काम करता है के बजाय

का उपयोग ऐसा लगता है() ऑपरेटरों के साथ कुछ समस्या है की तरह ...

!!

0

यूनिकोड के लिए इस (जोड़ा विकल्प यू की कोशिश करो और बदल ([\ s \ एस]) को?।।

<?php 
$doc = file_get_contents("http://prairieprogressive.com/"); 
$replace = array(
    "#<script.*?</ ?script>#u", 
    '#<style.*?</ ?style>#u', 
    "#<!--.*?-->#u", 
    "#\r\n#u" 
); 
$doc = preg_replace($replace,"",$doc); 
echo $doc; 
?> 
1

यह एक बग हो रहा है

ने उल्लेख किया टिप्पणी में आपका है, यह शैली regex जाता है कि इस का कारण है ताकि . भी नई पंक्ति से मेल खाता है एक समाधान के रूप में आप s संशोधक का उपयोग कर सकते हैं:।

$doc = preg_replace("/<style.*?<\/ ?style>/s",'',$doc); 
+0

PHP का कौन सा संस्करण क्योंकि जब मैं ऐसा करता हूं तो यह ठीक काम करता है। –

+0

@ वाइपर: 'PHP 5.3.2' – codaddict

0

[\s\S] का मुद्दा क्या है? यह किसी भी सफेद जगह चरित्र, और किसी भी गैर सफेद जगह से मेल खाता है। यदि आप इसे .* से प्रतिस्थापित करते हैं, तो यह ठीक काम करता है।

संपादित करें: यदि आप भी नई लाइनों मिलान करने के लिए चाहते हैं, s संशोधक का उपयोग करें। मेरी राय में, एक विरोधाभासी [\s\S] से समझना आसान है।

+1

' .' डिफ़ॉल्ट रूप से '\ n' से मेल नहीं खाता है लेकिन' [\ s \ S] 'करता है। – codaddict

+0

वह तब 's' संशोधक का उपयोग कर सकता है। या यहां तक ​​कि '[। \ N] * '। – netcoder

+0

हाँ वह कर सकता है, लेकिन '[\ s \ S]' का उपयोग भी मान्य है। – codaddict

संबंधित मुद्दे