开发者

Use String for Pattern but Exclude it from Being Removed

开发者 https://www.devze.com 2022-12-28 06:26 出处:网络
i\'m pretty new on regex, i have learned something by the way, but is still pour knowledge! so i want ask you for clarification on how it work!

i'm pretty new on regex, i have learned something by the way, but is still pour knowledge!

so i want ask you for clarification on how it work!

assuming i have the following strings, as you can see they can be formatted little different way one from another but they are very similar!

DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE

now i want replace everything between the first A-Z block and the colon so for example i would keep

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

so on my very noobs knowledge i have worked out this shitty regex! :-(

preg_replace( '/^[A-Z](?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

but why i'm sure this regex will not work!? :-)

Pls help me!

PS: the title of question is pretty explaned, i want also know how for example use a well know string block for match another...

preg_replace( '/^[DTSTART](开发者_JS百科?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

..without delete DTSTART

Thanks for the time!

Regards Luca Filosofi


You could use a relatively simple regex like the following.

$subject = 'DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE';

echo preg_replace('/^[A-Z]+\K[^:\n]*/m', '', $subject) . PHP_EOL;

It looks for a series of capital letters at the start of a line, resets the match starting point (that's what \K does) to the end of those and matches anything not a colon or newline (i.e. the parts you want to remove). Those matched parts are then replaced with an empty string.

The output from the above would be

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

If the lines that you are interested in will only ever start with DTSTART or DTEND then we could be more precise about what to match (e.g. ^DT(?:START|END)) but [A-Z] obviously covers both of those.


If you want to retain part of the matched pattern in a substitution, you put parentheses around it and then refer to it by $1 (or whichever grouping it is).

For example:

s/^(this is a sentence) to edit/$1/

gives "this is a sentence"


You can check out this example work similarly as your problem

\w+): (?P\d+)/', $str, $matches); /* This also works in PHP 5.2.2 (PCRE 7.0) and later, however * the above form is recommended for backwards compatibility */ // preg_match('/(?\w+): (?\d+)/', $str, $matches); print_r($matches); ?>
The above example will output:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

so if u need only digit u need to print $matches[digit]


You want to remove everything between a semicolon and either a colon or the end of the line, right? So use that as your expression. You're overcomplicating things.

preg_replace('/(?:;.+?:)|(?:;.+?$)/m','',$data);

It's a pretty simple expression. Either match (?:;.+?:) or (?:;.+?$), which differ only by their terminator (the first one matches up to a colon, the second one matches up to the end of the line).

Each is a non-capturing group that starts with a semicolon, reluctantly reads in all characters, then stops at the terminator. Everything matched by this is removable according to your description.

0

精彩评论

暂无评论...
验证码 换一张
取 消