Frage

I am trying to find anything that conforms to

<element ... bentleysoft-widget="mywidget" ...></element>

and replace it with something else.

My actual string is:

$text = '<div id="joboftheday" bentleysoft-widget="joboftheday"></div><div id="adults" bentleysoft-widget="test"></div>';

My preg_replace expression is this:

$output = preg_replace('|<.*bentleysoft-widget="([a-z]+)"></.*>|', 'zzz $1', $text, -1);

However, what I get back is this:

zzz test

So it seems that, for some reason, it only picks up one occurrence. Any ideas will be much appreciated, I've spent over three hours reading and scratching my head!

War es hilfreich?

Lösung

The problem is that .* is greedy. Take a look at this pattern /foo.*bar/ and the following text

foo hello bar world bar

The .* would match hello bar world because of the last bar.

To change this behaviour, you can simply add a ?, so the pattern would look like this

|<.*?bentleysoft-widget="([a-z]+)"></.*?>|

and it should work


Also since you want to capture the right closing tag, you should use a backreference here

|<(\S+?).*?bentleysoft-widget="([a-z]+)"></\\1>|

(\S+?) will get you the correct tag name (because \S matches everything but whitespaces), which can be backreferenced via \\1 (1 because it is the first group).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top