PiciuU
PiciuU

Reputation: 43

PHP preg_replace remove specific parts from string

im having problems with understanding regex in PHP. I have img src:

src="http://example.com/javascript:gallery('/info/2005/image.jpg',383,550)"

and need to build from it this:

src="http://example.com/info/2005/image.jpg"

How it it possible to cut first and last part from string to obtain clear link without javascript part?

Right now im using this regex:

$cont = 'src="http://example.com/javascript:gallery('/info/2005/image.jpg',383,550)"'

    $cont = preg_replace("/(src=\")(.*)(\/info)/","$1http://example.com$3", $cont);

and output is:

src="http://example.com/info/2005/image.jpg',383,550)"

Upvotes: 4

Views: 71

Answers (2)

The fourth bird
The fourth bird

Reputation: 163207

As an alternative solution, you might also capture the src="http://example.com part by matching the protocol in group 1, so you can use it in the replacement.

(src="https?://[^/]+)/[^']*'(/info[^']*)'[^"]*

Explanation

  • (src="https?://[^/]+)/ Capture group 1, match src="http, optional s, :// and till the first /
  • [^']*' Match any char except ', then match '
  • (/info[^']*) Capture group 2, match /info followed by any char except '
  • '[^"]* Match the ' followed by matching any char except "

Regex demo | Php demo

$cont = 'src="http://example.com/javascript:gallery(\'/info/2005/image.jpg\',383,550)"';
$cont = preg_replace("~(src=\"https?://[^/]+)/[^']*'(/info[^']*)'[^\"]*~", '$1$2', $cont);
echo $cont;

Output

src="http://example.com/info/2005/image.jpg"

Upvotes: 3

Ryszard Czech
Ryszard Czech

Reputation: 18611

Use

preg_replace("/src=\"\K.*(\/info[^']*)'[^\"]*/", 'http://example.com$1', $cont)

See regex proof.

Explanation

--------------------------------------------------------------------------------
  src=                     'src='
--------------------------------------------------------------------------------
  \"                       '"'
--------------------------------------------------------------------------------
  \K                       match reset operator
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
    info                     'info'
--------------------------------------------------------------------------------
    [^']*                    any character except: ''' (0 or more
                             times (matching the most amount possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  '                        '\''
--------------------------------------------------------------------------------
  [^\"]*                   any character except: '\"' (0 or more
                           times (matching the most amount possible))

Upvotes: 2

Related Questions