How to find out if part of the string is in quotes? - regex

So I have this pattern:
{% url my_view %}
{% url my_view user_id %}
And this is bad, so instead it should be like this:
{% url 'my_view' %}
{% url 'my_view' user_id %}
So the 'my_view' part should always be in quotes. All I need to do Is I need to find all the occurrences where 'my_view' part is not in quotes.
How can I do it?

Use lookarounds:
(?<={% url )[^'\s]*(?!')
See it in action

You can replace the result of following regex :
/\{% url (\S+)(.*)%\}/
With :
/\{% url \'\1\'\2%\}/
Or in some regex engines you may need to use $1 instead of \1.

You can use the following to match:
(?<=\{% url )(\S+)
And replace with:
'$1'
See DEMO
Edit: If you already have some my_view's with quotes use the following:
(?<=\{% url )([^']\S+[^'])(?=\s)
See DEMO

Related

Translating a working regex for Twig match

I've got a regex working that I'm unable to use with Twig match. Basically, I need to confirm if a message contains "#firstname lastname " in it anywhere. The message can have returns, multiple matches, etc. The regex must match the entire message as long as "#firstname lastname " exists in it somewhere.
This is the regex I got working here: https://regexr.com/
/.+?(?=#)#[A-z]+ [A-z]+ (.*)/gs
And it worked for: This is a bunch of text surrounding #firstname lastname and so forth
What I tried:
{%- set action -%}
Twig needs to handle the set in this format #firstname lastname
for what I need to work
{%- endset -%}
And:
{% set regex = '/.+?(?=#)#[A-z]+ [A-z]+ (.*)/gs' %}
Then:
{% if action matches regex %}
Working
{% else %}
Not working
{% endif %}
What I get is: Not Working
There is no space between lastname and for, also g is not a valid modifier in PHP
{% set regex = '/.+?(?=#)#[A-z]+ [A-z]+(.*)/s' %}
demo

Balanced regular expression

so I got my hands on regular expressions and tried to match the outer {% tag xyz %}{% endtag %} tags of the following text using regular expressions:
{% tag xyz %}
{% tag abc %}
{% endtag %}
{% endtag %}
My regular expression looks as follows and works so far:
({%)\s*(tag)([^%}]*?)(?:\s*(?:(%})((?:(?:[^{%]*?)|(?R))*)(?:({%)\s*(end\2)\s*(%}))))
But whenever the text inside of the matching tags contains a single { or % sign, the regex won't work as expected. I think it's because of the character classes that may match {% but also { or % as single characters too. I tried a lot and ended up with try and error but without success.
Any help on that issue?
I setup two regex101 links for you to show the issue:
works: https://regex101.com/r/qH0rI5/1
does not work: https://regex101.com/r/qH0rI5/2
Any help is really appreciated!
Try to to replace [^{%] with (?:(?!{%).) and add the s (PCRE_DOTALL) flag:
This would allow { that are not followed by % in between by using a negative lookahead.
Test your updated pattern or here another start to try with:
/{% tag \w+ %}(?:(?:(?!{%).)|(?0))*{% endtag %}/gs
test at regex101

How do I regex {% anything here %}?

I need to regex (% %)
e.g. I want to regex match {% this %} or {% anything really %}.
You just simply use
\{\%(.*?)\%\}
Well, you can just use the below if you can use groups
/\{([^}]+)}/g
Or else you can use the below if you just want the match without groups.
/(?<=\{)[^{}]+(?=\})/g
DEMO 1 & 2

Django: Reverse not found > {% url %} in template

This problem seems simple and it is described multiple times in SO, but I still can't figure out why it isn't working in my case.
So, I have a url declared in urls.py
urlpatterns = patterns('',
url(r'^(?P<country>[-\w]+)/$', CountryListView.as_view(), name='list_by_country'),)
and in my template I'm calling the url
<a href="{% url 'list_by_country' country.country__name %}" >{{ country.country__name }}</a>
However, I am getting the error message that the url could not be reversed
Reverse for 'list_by_country' with arguments '(u'United Kingdom',)' and keyword arguments '{}' not found
What is causing the reverse error? Are spaces in the argument maybe not allowed?
The problem is that "United Kingdom" doesn't match the regex [-\w]+. If you also want to match spaces, you should change your regex to [-\w\ ]+. Example:
url(r'^(?P<country>[-\w\ ]+)/$', CountryListView.as_view(), name='list_by_country')
You can also choose to match \s instead of just a single space character.

Outputting Literal curly braces in Liquid templates

I'm trying to output the following from within a liquid template:
{{ example }}
Obviously, Liquid sees this as a variable named example and tries to do substitution. I'm trying to find out how I can output the actual braces.
So far, I've found one method that works, but it's incredibly ugly:
{{ '{example'|prepend:'{' }}}}
Yeah, told you it was gross.
Here are other things I've tried:
{{{ example }}} # outputs '}'
{{{{ example }}}} # outputs '}}'
\{\{ example \}\} # outputs '\{\{ example \}\}'
Any advice here?
You can also use raw:
{% raw %}
...lots of liquid code goes here and it doesn't get interpreted...
{% endraw %}
What about using the numeric HTML entities { and } for { and } respectively - presumably this is to be output as HTML?
EDIT: Forgive me, I'm not too familiar with liquid (so this might be very wrong), but can you assign your {{ example }} special value to a variable and output that? May be something like:
{% assign special = '{{ example }}' %}
{{ special }}
This is the only thing that worked from me. Lifted from here:
{{ "{{ this " }}}}
I needed this because I wanted to reference the site global variable from inside a mustache template.
I wanted to have both curly brackets AND angle brackets when formatting a fenced code block, so I ended up with the following pattern:
{% capture code %}{% raw %}line 1
line 2
line 3
{% endraw %}{% endcapture %}
<pre><code>{{ code | replace: "<", "<" | replace: ">", ">" }}</code></pre>
You can escape the HTML, for example in a {{var}} you can use \{\{var\}\}, so that way luquid don't process it.