Akyegane
Akyegane

Reputation: 905

Convert PHP regular expression to c# RegEx pattern

I have small problem.I have to convert a regular expression from php to C#

\[(\[?)(blockquote)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\2\])[^\[]*+)*+)\[\/\2\])?)(\]?)

But I have a problem when use regx in c# and get this error

Match Pattern Error: parsing "[([?)(blockquote)(?![\w-])([^]/](?:/(?!])[^]/])*?)(?:(/)]|](?:([^[]+(?:[(?!/\2])[^[]+)*+)[/\2])?)(]?)" - Nested quantifier +.

Please advice.

generate php regex

[blockquote] some text... [/blockquote]

in wordpress from

function get_shortcode_regex() {
global $shortcode_tags;
$tagnames = array_keys($shortcode_tags);
$tagregexp = join( '|', array_map('preg_quote', $tagnames) );

// WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()
// Also, see shortcode_unautop() and shortcode.js.
return
      '\\['                              // Opening bracket
    . '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
    . "($tagregexp)"                     // 2: Shortcode name
    . '(?![\\w-])'                       // Not followed by word character or hyphen
    . '('                                // 3: Unroll the loop: Inside the opening shortcode tag
    .     '[^\\]\\/]*'                   // Not a closing bracket or forward slash
    .     '(?:'
    .         '\\/(?!\\])'               // A forward slash not followed by a closing bracket
    .         '[^\\]\\/]*'               // Not a closing bracket or forward slash
    .     ')*?'
    . ')'
    . '(?:'
    .     '(\\/)'                        // 4: Self closing tag ...
    .     '\\]'                          // ... and closing bracket
    . '|'
    .     '\\]'                          // Closing bracket
    .     '(?:'
    .         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
    .             '[^\\[]*+'             // Not an opening bracket
    .             '(?:'
    .                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
    .                 '[^\\[]*+'         // Not an opening bracket
    .             ')*+'
    .         ')'
    .         '\\[\\/\\2\\]'             // Closing shortcode tag
    .     ')?'
    . ')'
    . '(\\]?)';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]]

}

Upvotes: 2

Views: 1059

Answers (1)

Sergio
Sergio

Reputation: 6948

Well, according to this answer, .NET doesn't support possessive quantifiers.

So, you need to replace constructions like [0-9]*+ with something like (?>[0-9]*)

Upvotes: 1

Related Questions