Regex to filter BBCode lists The Next CEO of Stack OverflowTempered Greedy Token - What is different about placing the dot before the negative lookaheadMatch all occurrences of a regexA comprehensive regex for phone number validationHow to negate specific word in regex?RegEx match open tags except XHTML self-contained tagsbbcode style tags with pregCheck whether a string matches a regex in JSparsing multiple lists in bbcode?Javascript regex on textareaRemove all instances of token from comma separated list with regexReplace text in HTML and BBCode sample
Can I calculate next year's exemptions based on this year's refund/amount owed?
How many extra stops do monopods offer for tele photographs?
Expectation in a stochastic differential equation
Redefining symbol midway through a document
Is it okay to majorly distort historical facts while writing a fiction story?
Would a completely good Muggle be able to use a wand?
My ex-girlfriend uses my Apple ID to login to her iPad, do I have to give her my Apple ID password to reset it?
Is there a difference between "Fahrstuhl" and "Aufzug"?
Physiological effects of huge anime eyes
Computationally populating tables with probability data
Reference request: Grassmannian and Plucker coordinates in type B, C, D
Is it convenient to ask the journal's editor for two additional days to complete a review?
Which one is the true statement?
Is French Guiana a (hard) EU border?
Won the lottery - how do I keep the money?
Towers in the ocean; How deep can they be built?
AB diagonalizable then BA also diagonalizable
How did Beeri the Hittite come up with naming his daughter Yehudit?
How do I fit a non linear curve?
When "be it" is at the beginning of a sentence, what kind of structure do you call it?
Can you teleport closer to a creature you are Frightened of?
Decide between Polyglossia and Babel for LuaLaTeX in 2019
Easy to read palindrome checker
Can Sneak Attack be used when hitting with an improvised weapon?
Regex to filter BBCode lists
The Next CEO of Stack OverflowTempered Greedy Token - What is different about placing the dot before the negative lookaheadMatch all occurrences of a regexA comprehensive regex for phone number validationHow to negate specific word in regex?RegEx match open tags except XHTML self-contained tagsbbcode style tags with pregCheck whether a string matches a regex in JSparsing multiple lists in bbcode?Javascript regex on textareaRemove all instances of token from comma separated list with regexReplace text in HTML and BBCode sample
I am trying to improve legacy PHP code that deals with cleaning-up BBCode from a string and am currently facing trouble with lists.
The current solution for lists does the following:
...
$search[] = sprintf('~[%s](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s=(.*)](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s]~i', '*');
$replace[] = '$1';
$replace[] = '$2';
$replace[] = '';
...
return preg_replace($search, $replace, $string);
This works fine when the string is something like
[list]
[*]Item 1
[*]Item 2
[*]Item 3
[/list]
But it will also strip [*] if it's not inside lists and also fails with things like:
[list]
[*][list]
[*]Item 1.1
[*]Item 1.2
[*]Item 1.3
[/list]
[*]Item 2
[*]Item 3
[/list]
Is it even possible using RegExp only to strip the [list] or [list=1] + [/list] tags along with [*] if they are within lists?
php regex
add a comment |
I am trying to improve legacy PHP code that deals with cleaning-up BBCode from a string and am currently facing trouble with lists.
The current solution for lists does the following:
...
$search[] = sprintf('~[%s](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s=(.*)](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s]~i', '*');
$replace[] = '$1';
$replace[] = '$2';
$replace[] = '';
...
return preg_replace($search, $replace, $string);
This works fine when the string is something like
[list]
[*]Item 1
[*]Item 2
[*]Item 3
[/list]
But it will also strip [*] if it's not inside lists and also fails with things like:
[list]
[*][list]
[*]Item 1.1
[*]Item 1.2
[*]Item 1.3
[/list]
[*]Item 2
[*]Item 3
[/list]
Is it even possible using RegExp only to strip the [list] or [list=1] + [/list] tags along with [*] if they are within lists?
php regex
add a comment |
I am trying to improve legacy PHP code that deals with cleaning-up BBCode from a string and am currently facing trouble with lists.
The current solution for lists does the following:
...
$search[] = sprintf('~[%s](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s=(.*)](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s]~i', '*');
$replace[] = '$1';
$replace[] = '$2';
$replace[] = '';
...
return preg_replace($search, $replace, $string);
This works fine when the string is something like
[list]
[*]Item 1
[*]Item 2
[*]Item 3
[/list]
But it will also strip [*] if it's not inside lists and also fails with things like:
[list]
[*][list]
[*]Item 1.1
[*]Item 1.2
[*]Item 1.3
[/list]
[*]Item 2
[*]Item 3
[/list]
Is it even possible using RegExp only to strip the [list] or [list=1] + [/list] tags along with [*] if they are within lists?
php regex
I am trying to improve legacy PHP code that deals with cleaning-up BBCode from a string and am currently facing trouble with lists.
The current solution for lists does the following:
...
$search[] = sprintf('~[%s](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s=(.*)](.*)[/%s]~smUi', 'list', 'list');
$search[] = sprintf('~[%s]~i', '*');
$replace[] = '$1';
$replace[] = '$2';
$replace[] = '';
...
return preg_replace($search, $replace, $string);
This works fine when the string is something like
[list]
[*]Item 1
[*]Item 2
[*]Item 3
[/list]
But it will also strip [*] if it's not inside lists and also fails with things like:
[list]
[*][list]
[*]Item 1.1
[*]Item 1.2
[*]Item 1.3
[/list]
[*]Item 2
[*]Item 3
[/list]
Is it even possible using RegExp only to strip the [list] or [list=1] + [/list] tags along with [*] if they are within lists?
php regex
php regex
edited Mar 8 at 16:33
benvc
6,4531827
6,4531827
asked Mar 8 at 16:08
smaressmares
406518
406518
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You may use
$search[] = sprintf('~[(%s)(?:=[^]]*)?]((?:(?![1b).)*?)[/1]s*~si', 'list');
$search[] = sprintf('~[%s]~i', '\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do
$string = preg_replace($search, $replace, $string, -1, $count);
while ($count > 0);
return $string;
See the PHP demo.
I merged the first two regexps since they basically match the same (the =.*? part inside the open tag is just optional, I suggest using (?:=[^]]*)? to match = and then 0+ chars other than ] 1 or 0 times.
The ((?:(?![1b).)*?) pattern is a tempered greedy token that ensures that the innermost list tag is matched, 1 here matches the tag name that is captured with (%s).
The $count variable will hold the number of replacements done with preg_replace, and if nothing is replaced, the while block exits.
add a comment |
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55066928%2fregex-to-filter-bbcode-lists%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You may use
$search[] = sprintf('~[(%s)(?:=[^]]*)?]((?:(?![1b).)*?)[/1]s*~si', 'list');
$search[] = sprintf('~[%s]~i', '\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do
$string = preg_replace($search, $replace, $string, -1, $count);
while ($count > 0);
return $string;
See the PHP demo.
I merged the first two regexps since they basically match the same (the =.*? part inside the open tag is just optional, I suggest using (?:=[^]]*)? to match = and then 0+ chars other than ] 1 or 0 times.
The ((?:(?![1b).)*?) pattern is a tempered greedy token that ensures that the innermost list tag is matched, 1 here matches the tag name that is captured with (%s).
The $count variable will hold the number of replacements done with preg_replace, and if nothing is replaced, the while block exits.
add a comment |
You may use
$search[] = sprintf('~[(%s)(?:=[^]]*)?]((?:(?![1b).)*?)[/1]s*~si', 'list');
$search[] = sprintf('~[%s]~i', '\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do
$string = preg_replace($search, $replace, $string, -1, $count);
while ($count > 0);
return $string;
See the PHP demo.
I merged the first two regexps since they basically match the same (the =.*? part inside the open tag is just optional, I suggest using (?:=[^]]*)? to match = and then 0+ chars other than ] 1 or 0 times.
The ((?:(?![1b).)*?) pattern is a tempered greedy token that ensures that the innermost list tag is matched, 1 here matches the tag name that is captured with (%s).
The $count variable will hold the number of replacements done with preg_replace, and if nothing is replaced, the while block exits.
add a comment |
You may use
$search[] = sprintf('~[(%s)(?:=[^]]*)?]((?:(?![1b).)*?)[/1]s*~si', 'list');
$search[] = sprintf('~[%s]~i', '\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do
$string = preg_replace($search, $replace, $string, -1, $count);
while ($count > 0);
return $string;
See the PHP demo.
I merged the first two regexps since they basically match the same (the =.*? part inside the open tag is just optional, I suggest using (?:=[^]]*)? to match = and then 0+ chars other than ] 1 or 0 times.
The ((?:(?![1b).)*?) pattern is a tempered greedy token that ensures that the innermost list tag is matched, 1 here matches the tag name that is captured with (%s).
The $count variable will hold the number of replacements done with preg_replace, and if nothing is replaced, the while block exits.
You may use
$search[] = sprintf('~[(%s)(?:=[^]]*)?]((?:(?![1b).)*?)[/1]s*~si', 'list');
$search[] = sprintf('~[%s]~i', '\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do
$string = preg_replace($search, $replace, $string, -1, $count);
while ($count > 0);
return $string;
See the PHP demo.
I merged the first two regexps since they basically match the same (the =.*? part inside the open tag is just optional, I suggest using (?:=[^]]*)? to match = and then 0+ chars other than ] 1 or 0 times.
The ((?:(?