Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 338
  • Last Modified:

Php code to print between two delimiters

Hi,
Can someone help me convert this PERl to PHP?

Perl: (replace START and END to print everything between the two)
perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs'

Php:
???
0
cdukes
Asked:
cdukes
  • 7
  • 2
1 Solution
 
cdukesAuthor Commented:
Ok, so I have this, but it doesn't seem to work -- it only prints out the first 3 parts of the array????


// Example: printbetween("<title>", "<\/title>", $html_content);
function printbetween($start,$end,$data) {
    // preg_match("/$start(.*)$end/s",$data,$match);
    preg_match("/$start(.*?)$end/i",$data,$match);
    return $match;
}

    $TT = printbetween("<TT>", "<\/TT>", $res);
   foreach ($TT as $v) {
        echo "Data:: " .htmlspecialchars($v) ."\n<br>";
    }      


And this returns:
Data:: <TT><SPAN CLASS="contentbold">%CDP-3-PKTRECVFAIL:</SPAN></TT>
Data:: <SPAN CLASS="contentbold">%CDP-3-PKTRECVFAIL:</SPAN>
Data::

But it SHOULD be returning:

<TT><SPAN CLASS="contentbold">%CDP-3-PKTRECVFAIL:</SPAN></TT>
<TT> Failed to receive packet - [chars].</TT>
0
 
cdukesAuthor Commented:
For clarification, here's the page: I need to extract the following:

Error Message: %CDP-3-PKTRECVFAIL
Short Desc: Failed to receive packet - [chars].
Long Desc: Failed to receive a packet because of the reason shown in the error message.
Recommended Action: No action is required. Introduced Cisco MDS SAN-OS Release 1.2(2a).
Related documents: - No specific documents apply to this error message
Note that sometimes more than one result may be returned for the search, for example: if I just search on "CDP-", the page would return about 55 entries.

And here's the relevant html:

<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%" CLASS="appstablecolor">
   <TR>
      <TD WIDTH="6"><IMG SRC="/swa/i/spacer.gif" WIDTH="6" HEIGHT="17" ALT=""></TD>
      <TD WIDTH="99%" NOWRAP><IMG SRC="/swa/i/spacer.gif" WIDTH="1" HEIGHT="1" ALT=""><BR>
         <SPAN CLASS="contentheaderrev">Showing 1-1 of 1 results</SPAN>
         <IMG SRC="/swa/i/spacer.gif" WIDTH="1" HEIGHT="1" ALT=""></TD>
         <TD ALIGN="right" NOWRAP>
         <SPAN CLASS="contentheaderrev">
             
             Page:
             <SELECT NAME="select" onChange="JumpTo(this)">
             <OPTION VALUE="/cgi-bin/Support/Errordecoder/index.cgi?action=search&locale=en&query=CDP-3-PKTRECVFAIL&counter=0&paging=5&links=reference&index=all" SELECTED>1</OPTION>

             </SELECT>
             

         </SPAN>
      </TD>
      <TD WIDTH="7" ALIGN="right" VALIGN="top"><IMG SRC="/swa/i/corner_ur_7.gif" WIDTH="7" HEIGHT="7" ALT=""></TD>    
   </TR>
</TABLE>

<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%" CLASS="appstablecolor">
  <TR>
    <TD>
      <TABLE BORDER="0" CELLSPACING="1" CELLPADDING="5" WIDTH="100%">
      
      <TR BGCOLOR="#ffffff">
            <TD><SPAN CLASS="contentbold">1.</SPAN>
            <TT><SPAN CLASS="contentbold">%CDP-3-PKTRECVFAIL:</SPAN></TT>
            <TT> Failed to receive packet - [chars].</TT>
            <P>Failed to receive a packet because of the reason shown in the error message.<BR><BR>
            <B>Recommended Action:
</B>No action is required.
Introduced  Cisco MDS SAN-OS Release 1.2(2a).<BR>
            
                  
            <BR><B>Related documents- </B>No specific documents apply to this error message.
            <BR>
                  
                  
            </TD>
      </TR>
      

      </TABLE>
    </TD>
  </TR>
</TABLE>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%" CLASS="appstablecolor">
   <TR>
     <TD WIDTH="6"><IMG SRC="/swa/i/spacer.gif" WIDTH="6" HEIGHT="17" ALT=""></TD>
     <TD WIDTH="99%" NOWRAP><IMG SRC="/swa/i/spacer.gif" WIDTH="1" HEIGHT="1" ALT=""><BR>
       <SPAN CLASS="contentheaderrev">Showing 1-1 of 1 results</SPAN></TD>
       <TD ALIGN="right" NOWRAP>
       <SPAN CLASS="contentheaderrev">
      
         Page:
         <SELECT NAME="select" onChange="JumpTo(this)">
       <OPTION VALUE="/cgi-bin/Support/Errordecoder/index.cgi?action=search&locale=en&query=CDP-3-PKTRECVFAIL&counter=0&paging=5&links=reference&index=all" SELECTED>1</OPTION>

         </SELECT>
      
       </SPAN>
     </TD>
   </TR>
 </TABLE>



0
 
TeRReFCommented:
Try changing this line
  preg_match("/$start(.*?)$end/i",$data,$match);
into
  preg_match_all("/$start(.*?)$end/i",$data,$match);

Then to get the array you want:
$final_match = array();
foreach($matches as $match) {
    $final_match[] = $match[0];
}
print_r($final_match);
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
cdukesAuthor Commented:
That yeilds the same results...

function printbetween($start,$end,$data) {
    // preg_match("/$start(.*)$end/",$data,$match);
    preg_match_all("/$start(.*?)$end/i",$data,$match);
    return $match;
}        


   $TT = printbetween("<TT>", "<\/TT>", $res);
    $final_match = array();
    foreach($TT as $match) {
            $final_match[] = $match[0];
    }
    print_r($final_match);

Yeilds:
Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => %CDP-3-PKTRECVFAIL: )
0
 
TeRReFCommented:
Can you add this line:
print_r($TT);

between these lines:
   $TT = printbetween("<TT>", "<\/TT>", $res);
    $final_match = array();

and show me the result?
0
 
cdukesAuthor Commented:
k, here's what I did (removed the function "printbetween" in case it was causing the problem):

    $TT = preg_match_all("/<TT>(.*?)<\/TT>/i",$res,$match);
    echo "PRINT_R:<br>";
    print_r($match);
    echo "<BR>END PRINT_R:<br>";
    $final_match = array();
    echo "Foreach Loop: <br>";
    foreach($match as $matches) {
        $final_match[] = $matches[0];
    }
    print_r($final_match);


Output:
Array ( [0] => Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => Failed to receive packet - [chars]. ) [1] => Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => Failed to receive packet - [chars]. ) )
END PRINT_R:
Foreach Loop:
Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => %CDP-3-PKTRECVFAIL: )


0
 
cdukesAuthor Commented:
Eureka, I think I have it!

    $TT = preg_match_all("/<TT>(.*?)<\/TT>/i",$res,$match);
    echo "<br>";
    echo "Match: " .$match[0][0];
    echo "<br>";
    echo "Match2: " . $match[0][1];
    echo "<br>";
    echo "<br>";

Yeilds:

Match: %CDP-3-PKTRECVFAIL:
Match2: Failed to receive packet - [chars].
0
 
cdukesAuthor Commented:
Hrm...oddly enough, if I take the following:

    print "<b><font color=\"green\">END REPLY ARRAY</b></font><br>\n";
    $TT = preg_match_all("/<TT>(.*?)<\/TT>/i",$res,$match);
    echo "PRINT_R:<br>";
    print_r($match);
    echo "<BR>END PRINT_R:<br>";
    $final_match = array();
    echo "Foreach Loop: <br>";
    foreach($match as $matches) {
        $final_match[] = $matches[0];      
    }                                          
    print_r($final_match);        


Then it prints everything between <TT> and </TT>
Output:
PRINT_R:
Array ( [0] => Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => Failed to receive packet - [chars]. ) [1] => Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => Failed to receive packet - [chars]. ) )
END PRINT_R:
Foreach Loop:
Array ( [0] => %CDP-3-PKTRECVFAIL: [1] => %CDP-3-PKTRECVFAIL: )



But, if I widen it to print everything between <FORM> and </FORM> it doesn't work, why is that?
Output:
PRINT_R:
Array ( [0] => Array ( ) [1] => Array ( ) )
END PRINT_R:
Foreach Loop:
Array ( [0] => [1] => )

0
 
aminerdCommented:
By default the period (.) does not match new lines. You can modify this behaviour with the s (PCRE_DOTALL) modifier:

$TT = preg_match_all("/<FORM>(.*?)<\/FORM>/is", $res, $match);
0
 
cdukesAuthor Commented:
I've come to the realization that this question needs more information.
To that end, I've posted a new request to start clean, so to speak.
Please see:
http://www.experts-exchange.com/Web/Web_Languages/PHP/PHP_Databases/Q_21897932.html

for the new post.

(Note to Moderator, please remove this post at your earliest convenience).
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 7
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now