2011-07-17 15 views
6

मैं वर्तमान में काम कर रहा मॉड पुनर्लेखन Regex है:मॉड पुनर्लेखन Regex - या अधिक नकारात्मक Lookaheads

RewriteEngine On 
RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L] 

regex निम्न URL लेता है और यूआरएल तुरंत नीचे में बदल देती है कि:

www.site.com/cmd1/param/cmd2/param2/stillparam2 और इसे चालू में www.site.com/index.php?cmd1=param&cmd2=param2/stillparam2

यह ठीक काम करता है, लेकिन मैं यह सुनिश्चित करने के लिए एक और नकारात्मक लुकहेड दावा करना चाहूंगा कि एक यूआरएल ब्लॉक - यानी /texthere/ परम - अंडरस्कोर शामिल नहीं है। एक अमान्य स्ट्रिंग इस तरह दिख सकती है: www.test.com/cmd/thing/getparam_valuehere; रेगेक्स को cmd/thing को एक कुंजी और मूल्य जोड़ी के रूप में पार्स करना चाहिए और शेष स्ट्रिंग को अनदेखा करना चाहिए। इसके बाद मैं अंडरस्कोर के साथ यूआरएल के ब्लॉक को एक और यूआरएल पैरामीटर के रूप में जोड़ा जाने के लिए एक और रिवाइटरूल लिखूंगा। निम्नलिखित यूआरएल अनुवाद होगा:

www.test.com/cmd/param1/cmd2/directory/param2/sortorder_5 
www.test.com?cmd=param1&cmd2=directory/param2&sortorder=5 

कृपया मुझे बताएं कि क्या मैं पर्याप्त स्पष्ट नहीं हूं। कोई भी मदद बहुत अच्छी रहेगी।

एनबी: मैं एक नकारात्मक अग्रदर्शी पहले से ही मौजूद एक के अंदर नेस्टेड का उपयोग कर की कोशिश की है - (?!(?!)) - और एक | दो पर नकारात्मक lookaheads उपयोग करने की कोशिश की है, लेकिन न तो समाधान काम किया। मैंने सोचा कि शायद कुछ और मौलिक रूप से गलत था?

धन्यवाद सब कुछ।

संपादित करें: मैं भी निम्नलिखित की कोशिश की है - जो मैं वास्तव में सोचा था काम करेगा (लेकिन स्पष्ट रूप से, नहीं था!) ​​

RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(?![.+]*(?:_)[.+]*)(.+)) $1?$2=$3&%1 [L] 

कि निम्नलिखित है:

www.test.com/cmd/param1/sortorder_1/ करने के लिए अनुवाद www.test.com?cmd=param1/sortorder_1/

जब इसे इसके बजाय बनना चाहिए: www.test.com?cmd=param1&sortorder=2//sortorder_2/ को &sortorder=2 में अनुवाद करने का नियम अभी तक नहीं बनाया गया है, लेकिन आप उम्मीद कर सकते हैं कि मेरा क्या मतलब है)।

+2

_Lookbehinds_ निरंतर लंबाई का होना चाहिए, परिवर्तनीय-लंबाई लुकहेड ठीक होना चाहिए। – MRAB

+0

हां, निश्चित रूप से यहां केवल नकारात्मक दिखने का उपयोग किया जा रहा है। उत्तर के लिए धन्यवाद! – Pete171

+0

मैंने निम्नलिखित भी कोशिश की है: 'रिवाइट्रूल^(। * /)? ((?: cmd) [^ /] *)/((?! (?: [ए-ज़ा-जे 0-9]) * _ + (?: [ए-ज़ा-जे 0-9]) *) (। +)) $ 1? $ 2 = $ 3 और% 1 [एल] '। यहां, मैंने मूल (काम कर रहे) नकारात्मक लुकहेड को हटा दिया है और इसे किसी दूसरे के साथ बदल दिया है, यह सुनिश्चित करना चाहिए कि पैरामीटर के हिस्से के रूप में इसे शामिल करने से पहले एक यूआरएल ब्लॉक में अंडरस्कोर मौजूद न हो। यह काम नहीं किया, और निम्न क्वेरी स्ट्रिंग उत्पन्न: 'cmd = कुंजी/to/आदेश/value_here/sortorder_5 /' यह था मेरा इरादा इसे रोकने के लिए '/ value_here /' ताकि मैं मान्य सकता है ऋणात्मक लुकहेड अंडरस्कोर सेगमेंट को सही तरीके से पाता है। कोई भाग्य नहीं। – Pete171

उत्तर

1

प्रयोग के लगभग चार दिनों के बाद, मैं मूल रूप से खोजने की अपेक्षा की तुलना में कुछ अलग समाधान के साथ समाप्त हुआ। मैंने बस अपने index.php फ़ाइल में सभी वास्तविक यूआरएल मैनिपुलेशन को हटा दिया और वहां से सभी अनुरोधों को रूट किया। यहाँ मेरा (बहुत साफ) है।htaccess फ़ाइल:

Options +FollowSymlinks 
RewriteEngine On 
RewriteCond %{QUERY_STRING} (.*) 
RewriteRule (.*) index.php?path=$1 [QSA,L] 

और यहाँ मैं से URL दर्ज पार्स करने के लिए इस्तेमाल किया कोड के ब्लॉक है:

preg_match_all ('|/([ए-zA-Z0-9] +) ((? ! /) [ए-ज़ा-जे 0-9-।] *) | ', $ _GET [' पथ '], $ मैचों);

 // Remove all '$_GET' parameters from the actual $_GET superglobal: 
     foreach($matches[0] as $k => $v) { 
      $search = '/' . substr($v, 1); 
      $_GET['path'] = str_replace($search, '', $_GET['path'], $count); 
     } 

     // Add $_GET params to URL args 
     for ($i = 0; $i < count($matches[1]); $i++) { 
      self::$get_arguments[$matches[1][$i]] = $matches[2][$i]; 
     } 

     // Retrieve all 'cmd' properties from the URL and create an array with them: 
     preg_match_all('~(cmd[0-9]*)/(.+?)(?=(?:cmd)|(?:\z))~', $_GET['path'], $matches); 

     if (isset($matches[1][0])) { 
      return self::$url_arguments = array_combine($matches[1], $matches[2]); 

एक ऐसा URL पर: सब जो समय लगा पढ़ने के लिए करने के लिए

Array 
(
    [getparam] => valuepart1_valuepart2 
) 
Array 
(
    [cmd] => one/ 
    [cmd2] => two/ 
    [cmd3] => three/ 
    [cmd4] => four/ 
    [cmd5] => five/ 
) 

धन्यवाद:

http://localhost/frame_with_cms/frame/www/cmd/one/cmd2/two/cmd3/three/cmd4/four/getparam_valuepart1_valuepart2/cmd5/five/ 

यह सफलतापूर्वक इन अलग सरणियों जो मैं तो अनुरोधों को हैंडल करने का उपयोग का उत्पादन और जवाब दें।

+0

मुझे अपना पहला विचार स्वीकार करना है, यह एक .htaccess फ़ाइल में क्यों करें। हालांकि, यह उत्तर बाधाओं के कारण वास्तव में आपके लिए एक समाधान का समाधान नहीं है। – fncomp

0

क्या आपके वर्तमान नियम से पहले क्वेरी कार्य करने के लिए param_value को param_value को रखना आसान नहीं होगा?

कुछ

RewriteRule ^(.*)?/([^_/]+)_([^/]+)/ $1/?$2=$3 [N,QSA]

की तरह के रूप में परम = मूल्य क्वेरी स्ट्रिंग में सभी/param_value/भागों संलग्न करना होगा।

एन ध्वज का उपयोग करके देखभाल करें, आप एक अनंत लूप के साथ समाप्त हो सकते हैं।

+0

मैं काम के बाद कोशिश करूँगा और परिणाम पोस्ट करूंगा। उत्तर के लिए धन्यवाद! – Pete171

+0

@CharStringI में पहले से पहले उपरोक्त पुनर्लेखन नियम शामिल था, और मुझे एक infinte पाश मिला! उत्तर के लिए धन्यवाद, बहुत सराहना की। – Pete171

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