Question: Is there any clean grep one-liner to grep *only the PHP source* (the code between `<?` and `?>`) from a PHP file? Thus far I've tried:

```
grep -oiE "<\?php[[:print:]]*\?>" name_of_php_file

```

But it seems to return muddled entries like:

```
<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>

```

Expecting a one-liner which would return **only** PHP source, without any muddled entries. sed and awk are OK.

---

**EDIT:** The expected output is PHP source code, even if it spans multiple lines. The sample output is bad, as it contains HTML in between: `"><img src="gallerybig/`

---

**EDIT 2:** The answer given by @SigmaPiEpsilon works, but grep doesn't print code that spans multiple lines. For example, this snippet of code doesn't show up in the output:

```
<?php 
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>

```

Answer: 
You have to use a non-greedy search by adding a `?` after the `[[:print:]]*`. This is not available in normal grep but available with Perl syntax by specifying `-P` flag instead of `-E`. Check `man grep` to make sure your grep supports this.

```
$ Var='<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>'
$ echo $Var | grep -oiP "<\?php[[:print:]]*?\?>"
<?php print $row[0];?>
<?php echo $row[1];?>

```

To match this over multiple lines you have to specify a newline character and use the `-z` flag. The regex gets a little tricky, but instead of specifying non-greedy match with `?` you can use the complement match as `[^?]` which matches everything except `?`. See below

```
$ cat test_php 
<?php 
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>
$ grep -oizP "<\?php[^?]*\n*\?>" test_php
<?php 
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
<?php print $row[0];?>
<?php echo $row[1];?>

```
You can do what you've described so far with GNU awk:

```
$ gawk -v RS='?>' 'RT{sub(/.*<\?/,"<?"); print $0 RT}' file
<?php
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>

```

but it's obviously not robust since that wouldn't account for `?>` inside a comment or inside string or inside HTML or... so whether or not it'll do what you want depends on the non-trivial cases that you haven't shown us yet IF they exist in your real input.