XRX/Regular Expression Builder
Motivation
editYou want to build a form that will allow you to quickly test replacement regular expressions using XQuery's replace function.
Method
editWe will use an XForms client that has several controls:
- a test input string
- a regular expression to evaluate
- a new string to be used in the replace
- a "submit" trigger (button)
When the submit trigger is pressed, the three strings are sent to the server and the XQuery replace() function will be executed. The result is an output text area that is returned from the server to the web browser.
This tool will allow you to do things such as test your URL-rewrite rules.
Screen Image
editLink to Working Application
editSample Program
edit<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ev="http://www.w3.org/2001/xml-events" > <head> <style type="text/css"> @namespace xf url("http://www.w3.org/2002/xforms"); body {font-family: Ariel, Helvetica, san-serif} /* Input controls appear on their own lines. */ xf|input, xf|select, xf|select1, xf|textarea {display:block; margin:5px 0;} /* Makes the labels right aligned in a 150px wide column that floats to the left of the input controls. */ xf|input > xf|label, xf|select > xf|label, xf|select1 > xf|label, xf|textarea > xf|label, xf|output > xf|label {font-weight: bold;text-align:right; padding-right:10px; width:150px; float:left; text-align:right;} /* make the input boxes a little wider */ .xf-value {width: 200px} </style> <xf:model> <xf:instance id="request" xmlns=""> <data> <input>abcdefghi</input> <pattern>def</pattern> <replacement>123</replacement> </data> </xf:instance> <xf:instance id="response" xmlns=""> <data/> </xf:instance> <xf:submission id="submit" method="get" action="http://localhost:8080/exist/rest/db/test/replace/replace.xq" replace="instance" instance="response" separator="&"> <xf:toggle case="case-busy" ev:event="xforms-submit" /> <xf:toggle case="case-submit-error" ev:event="xforms-submit-error" /> <xf:toggle case="case-done" ev:event="xforms-submit-done" /> </xf:submission> </xf:model> </head> <body> <h1>XForms Replace Tester</h1> <xf:input ref="input"> <xf:label>Input:</xf:label> </xf:input> <xf:input ref="pattern"> <xf:label>Pattern:</xf:label> </xf:input> <xf:input ref="replacement"> <xf:label>Replacement:</xf:label> </xf:input> <xf:switch> <xf:case id="ready"> <xf:submit submission="submit"> <xf:label>Submit</xf:label> </xf:submit> <xf:submit submission="echo-test"> <xf:label>Echo Test</xf:label> </xf:submit> </xf:case> <xf:case id="case-busy"> <p>Waiting for response...</p> </xf:case> <xf:case id="case-submit-error"> <p>The server has returned a submit error event.</p> </xf:case> <xf:case id="case-done"> <xf:output ref="instance('response')/replace-result/text()"> <xf:label>Result:</xf:label> </xf:output> </xf:case> </xf:switch> </body> </html>
XQuery Replace Tester
editIf you are using eXist, just place this file on the server in the same folder as your XForms test driver.
In the example above I used a test folder on the localhost:
http://localhost:8080/exist/rest/db/test/replace/replace.xq
xquery version "1.0"; declare namespace exist = "http://exist.sourceforge.net/NS/exist"; declare namespace system="http://exist-db.org/xquery/system"; declare namespace request="http://exist-db.org/xquery/request"; declare option exist:serialize "method=xml media-type=text/xml indent=yes"; (: replace demo :) let $input := request:get-parameter('input', '') let $pattern := request:get-parameter('pattern', '') let $replacement := request:get-parameter('replacement', '') return <results> <input>{$input }</input> <pattern>{$pattern}</pattern> <replacement>{$replacement}</replacement> <replace-result>{replace($input , $pattern, $replacement)}</replace-result> </results>
Discussion
editThis shows that you can quickly build tools to teach yourself complex functions like regular expression handling. You can also use the XQuery match function, which returns true or false if the regular expression matches an input string.
There are two variations of this example that are interesting. The first is where you replace the input form with a large text area for doing global replacements of large blocks of text. The second is where you replace the input box with a selection list with common replacement patterns.
References
editExamples of replacement functions can be found here: